![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание объектов в потоках TSocketServer
victorgugo © (2010-02-22 01:53:00)Здравствуйте!
Задача следующая: есть блокирующий TSocketServer. Соответственно при получении потока (GetThread) нужно для каждого этого потока создавать объекты доступа к БД, а при отключении - разрушать их. В главном модуле:
procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
begin
SocketThread:=TServerThread.Create(True, ClientSocket);
SocketThread.Priority:=tpLower;
SocketThread.Resume;
end;
TServerThread - клас описанный в отдельном модуле, унаследованный от TServerClientThread.
В процедуре ClientExecute класа TServerThread создаём компоненты доступа:
IBTransaction1.Create(Application);
IBDataBase1.Create(Application);
IBQuery1.Create(Application);
При компиляции ошибок не выдаёт, но как только подключается клиент:
First chance exception at $7C812AFB. Exception class EAccessViolation with message 'Access violation at address 004A1B52 in module 'Project1.exe'. Read of address 00000EA8'. Process Project1.exe (1032)
Вместо Application в IBTransaction1.Create(Application); пробовал и Form1 и другие компоненты, все время такая ошибка.
Вопрос: как безболезнено создать объекты для потока сервера TServerSocket?
Заранее спасибо
Slym (2010-02-24 11:00:00) [1]victorgugo (22.02.10 2:22) [1]
+1 [4]
передавай nil Create(nil) если не знаешь зачем оно туда передается...
Сергей М. (2010-02-24 08:24:00) [2]В доп.потокее обращения к визуальным VCL-объектам недопустимы.
Таким объектом в дан.случае является объект Application.
victorgugo (2010-02-24 00:17:00) [3]
> До поры до времени.Грабли совсем близко.
Может покажете где приблизительно эти грабли?
Сергей М. (2010-02-23 22:09:00) [4]> Всё работает
До поры до времени.
Грабли совсем близко.
victorgugo (2010-02-22 02:22:00) [5]
> IBTransaction1.Create(Application);IBDataBase1.Create(Application);
> IBQuery1.Create(Application);
Вот что бывает, когда долго не пишешь на Делфи. Я уже и забыл как объекты создавать:
IBTransaction1 := TIBTransaction.Create(Application);
IBDataBase1 := TIBDataBase.Create(Application);
IBQuery1 := TIBQuery.Create(Application);
Всё работает))))