Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

блокировка таблица [D5]


Страницы:   1 2

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]

А как должно быть по твоему?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо