![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
блокировка таблица [D5]
Kein © (2004-03-05 15:42:00)люди, почему когда я делаю LockTable(ltReadLock), то всё равно могу читать данные из таблицы?
Kein (2004-03-05 16:49:00) [1]2Vlad
пасибо
Vlad (2004-03-05 16:31:00) [2]
> Kein © (05.03.04 16:22) [20]
Ты знаешь, мне сейчас просто лень настраивать БДЕ, создавать таблицы и проверять этот код, но подозреваю, что нужно создавать экземпляр TDataBase и уже к нему подключать сессию, а не к TTable. Проверь на досуге.
Kein (2004-03-05 16:22:00) [3]2Vlad
а зачем?
доступ к таблице я могу получить и через TTable
Vlad (2004-03-05 16:21:00) [4]
> Kein © (05.03.04 16:13) [18]
где экземпляр TDataBase?
Kein (2004-03-05 16:13:00) [5]2Vlad
ты посмотрел код?что можешь сказать?
Vlad (2004-03-05 16:10:00) [6]
> Anatoly Podgoretsky © (05.03.04 16:04) [12]
в справке по TLockType об этом сказано
Kein (2004-03-05 16:09:00) [7]кто-нибудь попоробовал, есть предложения?
Kein (2004-03-05 16:09:00) [8]кто-нибудь попоробовал, есть предложения?
Kein (2004-03-05 16:05:00) [9]2Vlad
я сессию вручную создаю, в этом всё идело
Anatoly Podgoretsky (2004-03-05 16:04:00) [10]В справке ни о каких сессия речи не идет
Requesting a read lock prevents other applications from reading a table.
Kein (2004-03-05 16:04:00) [11]юнит раз
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, DBGrids, Db, DBTables, Unit2, StdCtrls;
type
TForm1 = class(TForm)
Table1: TTable;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
NewThread : TDBThread;
S : TSession;
T : TTable;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
Form1.Table1.LockTable(ltReadLock);
Form1.Table1.LockTable(ltWriteLock);
S := TSession.Create(self);
T := TTable.Create(self);
NewThread := TDBThread.Create(S,T);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
NewThread.Suspend;
NewThread.Destroy;
Table1.Active := true;
Table1.UnlockTable(ltReadLock);
Table1.UnlockTable(ltWriteLock);
end;
end.
юнит два
unit Unit2;
interface
uses
Classes, DBTables, SysUtils;
type
TDBThread = class(TThread)
private
FThreadSession : TSession;
FThreadTable : TTable;
protected
procedure Execute; override;
public
constructor Create(Session : TSession; Table : TTable); virtual;
destructor Destroy; override;
end;
implementation
uses
Unit1;
constructor TDBThread.Create(Session : TSession; Table : TTable);
begin
inherited Create(true);
FThreadSession := Session;
FThreadTable := Table;
Resume;
end;
destructor TDBThread.Destroy;
begin
FThreadSession.Free;
FThreadTable.Free;
inherited;
end;
procedure TDBThread.Execute;
var
str1, str2 : string[10];
begin
str1 := '';
str2 := '';
FThreadSession.SessionName := '1';
FThreadTable.DatabaseName := 'DBDEMOS';
FThreadTable.TableName := 'Animals.dbf';
FThreadTable.SessionName := FThreadSession.SessionName;
FThreadTable.Active := true;
str1 := Form1.Table1.FieldByName('NAME').AsString;
str2 := FThreadTable.FieldByName('NAME').AsString;
end;
end.
Johnmen (2004-03-05 16:03:00) [12]>Kein © (05.03.04 16:01) [9]
У тебя в каждом потоке своя сессия ?
Vlad (2004-03-05 16:02:00) [13]
> Kein © (05.03.04 16:01) [9]
Ну наверное для того чтобы в потоке была отдельная сессия, ее нужно самому создать в этом потоке ? :-)
Kein (2004-03-05 16:01:00) [14]2Johnmen
но для каждого потока должна быть отдельная сессия от неё то блокируется
ltReadLock Other applications (or sessions) can not read from the table.
или я не прав?
Vlad (2004-03-05 15:59:00) [15]Давно бы уж привел код.
Только можно я у себя запускать не буду ? :-)
Johnmen (2004-03-05 15:58:00) [16]>Kein © (05.03.04 15:56) [6]
В хелпе ни слова о потоках !!!
Kein (2004-03-05 15:56:00) [17]2Vlad
хорошо, давай ка я опубликую текст двух юнитов(два потока читают) и запусти их у себя. а потом расскажи читается у тебя из другого потока или нет,ok?
Vlad (2004-03-05 15:54:00) [18]
> говорит должно блокирнуться.
Вот прям так и говорит ? :)))
Читаем внимательно
ltReadLock Other applications (or sessions)can not read from the table.
Kein (2004-03-05 15:53:00) [19]2Vlad
говорит должно блокирнуться.
ещё вопрос: это дело блокирует таблицу на уровне файла или как?
скажем так - кто после такой блокировки не должен иметь к таблице доступа?
Reindeer Moss Eater (2004-03-05 15:51:00) [20]А как должно быть по твоему?