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

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

Thread (будь он неладен) [D5, NT4]


Страницы:   1 2

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


Страницы:   1 2

Наверх

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