Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.09;
Скачать: CL | DM;

Вниз

Как корректно терминировать нить с GetMessage?   Найти похожие ветки 

 
Aleksandr.   (2006-05-24 18:52) [0]

Нить создается с FreeOnTerminate:=false, Execute у нее такой:

var
 Mesg : TagMSG;
 s    : shortstring;
 P    : PChar;
begin
 repeat
   While GetMessage(Mesg,0,0,0) do begin
     if Mesg.message=WM_SetNUProgress then begin
       P:=PChar(Mesg.wParam);
       S:=StrPas(P);
       StrDispose(P);
       DoLog(s)
     end;
     DispatchMessage(Mesg)
   end
 until Terminated
end;

Эта нить получает текстовые сообщения из других потоков по PostThreadMessage. Первоначально она имела FreeOnTerminate=true, и прекращала работу по LogThread.Terminate, но т.к. D2006 отчет о ликах такие нити фиксирует как утечки памяти, что нервирует, япопытался переделать ее завершение на

LogThread.Terminate;
LogThread.WaitFor;
FreeAndNil(LogThread)

В итоге на WaitFor программа зависает. Попробовал добавить в обработчик еще одно сообщение, по которому нить должна терминироваться, и завершать ее как

PostThreadMessage(LogThread.Handle,um_Terminate,0,0);
LogThread.WaitFor;
 FreeAndNil(LogThread)

но эффект тот же. Как правильно надо сделать?


 
Leonid Troyanovsky ©   (2006-05-24 19:15) [1]


> Aleksandr.   (24.05.06 18:52)  

> но эффект тот же. Как правильно надо сделать?


Написать свой Terminate, который будет

inherited;
PostThreadMessage(threadId, WM_QUIT, 0, 0);

Т.к., он не виртуальный, то для порядка переписать Destroy

Кста Dispath тут лишний.

--
Regards, LVT.


 
Aleksandr.   (2006-05-25 11:30) [2]


> Dispath тут лишний.

В смысле, лишний? То есть его вообще не надо нигде вызывать?


 
evvcom ©   (2006-05-25 12:30) [3]


> Т.к., он не виртуальный, то для порядка переписать Destroy

Да... Terminate зря, конечно, они не сделали виртуальным :(


 
Leonid Troyanovsky ©   (2006-05-25 18:39) [4]


> Aleksandr.   (25.05.06 11:30) [2]

> В смысле, лишний? То есть его вообще не надо нигде вызывать?


В данном случае, когда у потока нет окон,
этот вызов не нужен.

--
Regards, LVT.



Страницы: 1 вся ветка

Текущий архив: 2006.07.09;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.037 c
2-1150542953
Андрей из Смоленска
2006-06-17 15:15
2006.07.09
Как выдрать координаты из файла, созданого осциллографом? :)


3-1147255459
samalex
2006-05-10 14:04
2006.07.09
Зависание Firebird


6-1140865230
WondeRu
2006-02-25 14:00
2006.07.09
Связь ISAPI модуля и внешнего приложения


6-1141631672
Venchik
2006-03-06 10:54
2006.07.09
Delphi 7. Менеджер закачек. Выбор классов, компонент.


4-1143822624
Alek_1
2006-03-31 20:30
2006.07.09
Работа с ИК-портами