![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Thread (будь он неладен) [D5, NT4]
roman_tutov © (2002-12-22 18:18:00)Есть форма на которой находиться компонент pFibDatabase
В процессе работы программа запускает треды которые к этой компоненте обращаються . Проблема в том что два треда одновременно запущенные не могут работать с вышеуказанным компонентом . Вопрос :
как эту проблему обойти . Или для каждого треда нужен свой источник данных ? Как мне в треде (который не имеет своей формы) использовать свой компонент . Пока я все налепил на Form1 и из треда обращаюсь form1.,блаблабла Что не есть правильно .
Заранее спасибо за ответ
Vasya Pupkin (2002-12-25 11:26:00) [1]Я проблему решал следующим образом:
1. при инициализации создаю критическую секцию (один из объектов синхронизации)
2. при задействовании компонента в нескольких трэдах сначала вхожу в критическую секцию (EnterCriticalSection), работаю с компонентом, далее освобождаю критическую секцию (LeaveCriticalSection). Не забывать про Try ... Finally...LeaveCriticalSection ... End
3. при выгрузке удаляю критическую секцию.
Работает очень быстро!
Digitman (2002-12-24 13:36:00) [2]А с чего бы (до этого момента) базе уже быть Connected = True ?
Ты ж и строчку эту пишешь, для того чтобы активизировать новое соединение) ..
Roman_Tutov (2002-12-24 13:29:00) [3]в MypFIBDatabase.Connected:=true;
Digitman (2002-12-24 13:05:00) [4]Ну и ? В какой точке обнаружил сабж ?
Roman_Tutov (2002-12-24 12:58:00) [5]Я пошагово весь тред прошел
Digitman (2002-12-24 12:40:00) [6]
> Если запустить 2 треда то в обоих
> MypFIBDatabase.connected становиться false
И как ты определил это ? Ты брейкпойнт ставил ? Где ставил, в какой точке ?
VaS (2002-12-24 12:19:00) [7]With не тебе надо, а нам, чтобы код читался лучше. Заботиться надо о людях. Эх, молодежь...
Roman_Tutov (2002-12-24 12:11:00) [8]MypFIBTransaction1,MypFIBDatabase и MypFibDataset3 это локальные
переменные процедуры Execute
To VaS
Что за "with" и к чему оно мне ?
VaS (2002-12-24 11:56:00) [9]Да, и есть еще такое недокументированное ключевое слово в языке - "with".
Digitman (2002-12-24 11:02:00) [10]Ну я надеюсь, что и MypFIBTransaction1,MypFIBDatabase и MypFibDataset3 - это у тебя поля поточного класса ? Или, на кр.случай - лок.переменные процедуры Execute ?
Roman_Tutov (2002-12-24 09:51:00) [11]упс
MypFIBDatabase:= TpFIBDatabase.Create(Application);
читать как
MypFIBDatabase:= TpFIBDatabase.Create(nil);
Roman_Tutov (2002-12-24 09:40:00) [12]Я хочу привести вырезку кода
MypFIBTransaction1:= TpFIBTransaction.Create(nil);
MypFIBDatabase:= TpFIBDatabase.Create(Application);
MypFibDataset3:= TpFIBDataset.Create(nil);
MypFIBTransaction1.DefaultDatabase:=MyPFIBDatabase;
MypFIBDatabase.DatabaseName:=host;
MypFIBDatabase.SQLDialect:=3;
MypFIBDatabase.DBParams.Add("lc_ctype=WIN1251");
MypFIBDatabase.DBParams.Add("password=secretpasswd");
MypFIBDatabase.DBParams.Add("user_name=myname");
MypFIBDatabase.DefaultTransaction:=MypFIBTransaction1;
MypFIBDatabase.Timeout:=10000;
MypFIBDatabase.UseLoginPrompt:=false;
MypFIBDatabase.SynchronizeTime:=false;
MypFIBDatabase.WaitForRestoreConnect:=10000;
MypFIBDatabase.CacheSchemaOptions.AutoLoadFromFile:=false;
MypFIBDatabase.CacheSchemaOptions.AutoSaveToFile:=false;
MypFibDataset3.Database:=MypFIBDatabase;
MypFibDataset3.AutoCalcFields:=True;
MypFibDataset3.AutoCommit:=False;
MypFibDataset3.BufferChunks:=2048;
MypFibDataset3.CachedUpdates:=false;
MypFibDataset3.DataSet_ID:=0;
MypFibDataset3.Filtered:=false;
MypFibDataset3.Transaction:=MypFIBTransaction1;
MypFibDataset3.SQLs.SelectSQL.Add("SELECT * FROM TBL1");
try
begin
MypFIBDatabase.Connected:=true;
MypFIBDataSet3.Active:=true;
MypFIBDataSet3.First;
while not MypFIBDataSet3.Eof do
begin
{ковыряюсь в базе}
end;
MypFIBDataSet3.Next;
end;
except
end;
MypFIBDatabase.Connected:=false;
MypFIBDatabase.Free;
MypFIBTransaction1.Free;
MypFibDataset3.Free;
Вот этоткусок кода нормально работает в треде .НО ТОЛЬКо если тред один . Если запустить 2 треда то в обоих
MypFIBDatabase.connected становиться false
Куда копать ?
Smithson (2002-12-23 17:36:00) [13]Может быть. Я пользую ODAC - у него проблем не возникает при многопоточности. Хотя не знаю, предназначена ли его TOraSession для такой работы.
Digitman (2002-12-23 17:14:00) [14]
> Roman_Tutov
Никаких Application в кач-ве владельца !
MypFIBDatabase:= TpFIBDatabase.Create(nil);
try
finally
MypFIBDatabase.Free;
end;
> Smithson
> Если это эквивалент стандартного session, то он дожен быть
> один на программу
TSession - не thread-safe компонент. Недопустимо обращаться к сессии, созданной в одном потоке, из другого. Каждый поток обязан создавать свои собственные сессии
Smithson (2002-12-23 17:00:00) [15]Хто такой TpFIBDatabase?
Если это эквивалент стандартного session, то он дожен быть один на
программу. А вот все запросы к базе должны быть индивидуальны для каждого потока.
Roman_Tutov (2002-12-23 16:58:00) [16]я в потоках работаю с БД .
В коде потока создаю бд
MypFIBDatabase:= TpFIBDatabase.Create(Application);
Как поток сделал что нужно делаю
MypFIBDatabase.Free;
И пока запущен один поток все прекрасно работает .
Если запустить 2й , то в обоих потоках происходит
disconnect от базы
Smithson (2002-12-23 16:49:00) [17]В каждом потоке должен быть свой NMHTTP. В начале execute создается, в конце освобождается.
Roman_Tutov (2002-12-23 16:35:00) [18]Сделал как выше советовали . Все-равно в одном потоке работает , а если попытаться запустить несколько потоков то они все останавливаються. Причем что происходит понять не могу .
Может есть какая-нибудь хитрость ?
Roman_Tutov (2002-12-23 11:19:00) [19]Спасибо
Smithson (2002-12-23 09:37:00) [20]uses Forms