![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Thread - как остановить поток ? [D6, Win2k, WinXP]
Amid © (2004-10-01 15:08:00)проблема с Thread-ом.
Сосдаю поток каторый загружает DLL, потом вызываю функцию (из DLL) которая соеденяется с сервером прилож. и ждёт сообщение. Как зделоть так чтобы этот поток закрылся если сообщение не пришло в течение 30 сек и написал в Мемо какоето сообщение ?
Семен Сорокин (2004-10-01 16:17:00) [1]
>
> > 3. Подскажите пожалуста как можна приостоноить (закрыть)
>
> > этот поток после .. сек, если он работает ?
>
>
> корректно, думаю - никак
а если некорректно - то запускать в потоке, только не все, а вызов этой функции и рубить поток, чревато незакрытыми ресурсами и иже сним.
Digitman (2004-10-01 16:14:00) [2]
> 1. Соединение с "сервером прилож." пресходит в DLL в GetDocumentData.
принято к сведению
> 2. Этот DLL не я создал, и иходники тоже нету.
тогда твое дело - швах
> 3. Подскажите пожалуста как можна приостоноить (закрыть)
> этот поток после .. сек, если он работает ?
корректно, думаю - никак
Amid (2004-10-01 16:04:00) [3]1. Соединение с "сервером прилож." пресходит в DLL в GetDocumentData.
2. Этот DLL не я создал, и иходники тоже нету.
3. Подскажите пожалуста как можна приостоноить (закрыть) этот поток после .. сек, если он работает ?
Digitman (2004-10-01 15:47:00) [4]В приведенном коде
1. Нет ни единого упоминания о "сервере приложений" с т.з. терминологии и механизма Делфи .. а есть упоминание о сервере автоматизации
2.
> Form1.laDateIn.Caption:=
начиная с этого места - до свидания ! ... вперед ! читать инф-цию о потоконебезопасности VCL до полного просветления !
Семен Сорокин (2004-10-01 15:46:00) [5]наверное ожидание происходит в DLL в GetDocumentData, дык там и надо выставлять таймаут, передавай его параметром, а тут у тебя даже цикла нет.
Amid (2004-10-01 15:39:00) [6]Вот код програмы.
Програма на этот момент "@GetDocumentData:= GetProcAddress.." ждёт, где ставить этот цикл, как закрыть поток после 30 сек.
TGetDocumentData = function (.....);
Frid=Class(TThread)
private
GetDocumentData : TGetDocumentData;
V : Variant;
passdll : THandle;
protected
procedure Execute; override;
End;
Function TForm1.LoadPassportDll: THandle;
Begin
Result:= LoadLibrary('Passport2.dll');
If (Result = 0) Then
raise Exception.Create('Unable to load Passport2.dll');
End;
Procedure Frid.Execute;
Begin
passdll:= Form1.LoadPassportDll;
If (passdll <> 0) Then
Begin{****}
Try
@GetDocumentData:= GetProcAddress(passdll,
'GetDocumentData');
Except on E : Exception do End;
If (@GetDocumentData <> nil) then
Begin{qwe}
Try
CoInitialize(nil);
V:= GetDocumentData(Form1.EdUserName.Text,
Form1.EdPassword.Text);
CoUninitialize;
Except on E : Exception do End;
Form1.laDateIn.Caption:= VarToStr(V[3]);
Form1.laExpireDate.Caption:= VarToStr(V[4]);
Form1.laHologram.Caption:= VarToStr(V[5]);
..................
..................
End;{qwe}
End;{*****}
End;{}
Суслик (2004-10-01 15:31:00) [7]
> с пом. какого компонента в доп.трэде осуществляется "соединение"
> с апп-сервером ?
да в общем то и как ожидание реализовно тоже не мешало бы знать.
Digitman (2004-10-01 15:26:00) [8]с пом. какого компонента в доп.трэде осуществляется "соединение" с апп-сервером ?
Семен Сорокин (2004-10-01 15:17:00) [9]GetTickCount или Now в начале ожидания, и в цикле сравнивать с предыдущим значением если больше 30 сек. - рубить цикл ожидания.