![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Terminate Thread [D6, Win2k]
rio © (2003-11-25 16:37:00)
Уважаемые мастера, подскажите, пожалуйста, каким образом можно из приложения выполнить метод Terminate для порожденных им нитей, имея только их Handle"s и ThreadID"s?
Сообщение с помощью PostThreadMessage(MyThreadID,WM_USER+4,0,0) благополучно отправляются, но отловить и обработать его внутри Thread"a как-то не получается:
//внутренность нити
...
type
T_SimpleThread = class(TThread)
private
{ Private declarations }
procedure WMClose(var mes: TMessage); message WM_USER+4;
...
procedure T_SimpleThread.WMClose(var mes: TMessage);
begin
Terminate;
end;
...
procedure T_SimpleThread.Execute;
begin
while(not Terminated)do begin
...
Sleep(1000);
end;
end;
Что здесь не так? Может быть существует другой способ за-terminat"ить нитку?
Заранее спасибо!
rio (2003-11-25 17:43:00) [1]
Хорошо, спасибо!
Буду пробовать.
Digitman (2003-11-25 17:13:00) [2]
> rio
в принципе нет нужды резервировать индивидуальный код сообщения для этой цели и при таком подходе
достаточно выполнить
PostThreadMessage(MySimpleThreadInstance.ThreadID,WM_QUIT,0,0)
чтобы "висевший" вызов ф-ции GetMessage() "проснулся" и вернул тебе False (вместо True при ЛЮБОМ ДРУГОМ коде сообщения), и упомянутый цикл завершится
Digitman (2003-11-25 17:06:00) [3]
> clickmaker
у него не DispatchMessage(), а Dispatch()
разные вещи совершенно
нужен ! концептуально это правильный и наиудобнейший подход с использованием Dispatch()
Digitman (2003-11-25 17:04:00) [4]
1) PostThreadMessage(MySimpleThreadInstance.ThreadID,WM_USER+4,0,0)
2) sleep() зачем ? убери, не нужен вообще он тут
clickmaker (2003-11-25 17:02:00) [5]
DispatchMessage не нужен
rio (2003-11-25 16:58:00) [6]
я пытался делать и это:
procedure T_SimpleThread.Execute;
var Msg: TMsg;
begin
...
while(GetMessage(Msg,0,0,0))do begin
Dispatch(Msg.Message);
...
Sleep(1000);
end;
..
end;
но не получается - в начале цикла виснет.
Digitman (2003-11-25 16:40:00) [7]
> Что здесь не так?
в теле процедуры Execute нет цикла выборки/диспетчеризации/обработки сообщений, посланных тобой треду ... вот он и не реагирует никак на PostThreadMessage()