![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Socket -> Thread [D6, Win95/98, WinXP]
FireMan_Alexey © (2004-05-23 10:33:00)Ув. Мастера!
Использую сокет в потоке и хотел задать вопрос по поводу обработки событий.
Вот заголовок класса:
TEvent=Procedure (Sender:TObject) of object;
TThreadSock=Class(TThread)
Private
FSocket :TSocket;
FRead :TEvent;
FError :Integer;
FHost :String;
RecvMem :TMyMemory;
SendMem :TMyMemory;
Procedure Read;
Procedure Write;
Function ReceiveLength(Socket:TSocket):Integer;
Protected
Procedure Execute;Override;
Public
Procedure Lock;
Procedure Unlock;
Procedure SetSocket(Socket:TSocket);
Constructor Create;
Destructor Destroy;Override;
Property Error :Integer Read FError;
Property SocketHandle:TSocket Read FSocket;
Property Host :String Read FHost Write FHost;
Property ReceiveData :TMyMemory Read RecvMem;
Property SendData :TMyMemory Read SendMem;
Property OnRead :TEvent Read FRead Write FRead;
End;
Вопрос если я буду использовать вызов FRead(Self) и это будет вызываться процедура формы,
то не возникнет ли какое-нибудь исключение без использования синхронизации?
Уже пробовал такое сочетание.
Procedure Read;
Begin
If Assigned(FRead) Then FRead(Self);
End;
А в процедуре Execute:
If (NetEvent.lNetworkEvents and FD_READ_BIT)<>0 Then Synchronize(Read);
Но такой вариант не проходит! Процедура Read даже не выполнятся!
Рассматривал модуль SCKTCOMP.Pas и видел там используют TCriticalSection. Для чего?
Digitman (2004-05-24 08:17:00) [21]вызов обработчиков транспортных событий в осн.код.потоке (см. Synchronize) полностью лишает смысла "вынос" гнездового транспорта в доп.код.поток
Polevi (2004-05-23 19:20:00) [22]>Процедура Read даже не выполнятся!
должна выполнятся, если конечно условие выполняется