Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
ВнизЧем заменить TThread.Suspend ? Найти похожие ветки
← →
Timego (2004-03-24 13:16) [0]Уважаемые мастера!
В форуме неоднократно высказывалась мысль о том, что
TThread.Suspend и TThread.Resume - проктологический способ остановки-старта потока и что лучше пользоваться отправкой сообщения потоку.
А как быть если нужно приостановить какой-то поток, но не выходить из Tthread.Execute (чтобы потом не создавать заново) и так чтобы поток не крутился все время вхолостую проверяя какое-то условие? Suspend как раз в этом случае выручал, хотя иногда возникают сложности. Подскажите, пожалуйста, как сделать лучше.
← →
Digitman © (2004-03-24 13:26) [1]TMyThread = class(TThread)
procedure MsgПроснись(var message: TMessage); message TM_ПРОСНИСЬ;
end;
..
procedure TMyThread.Execute;
begin
while not Terminated and GetMessage(Msg, 0, 0, 0) do //спим, когда надо - нас разбудит система
Dispatch(Msg.Message); //проснулись и пытаемся понять, чего от нас хотят
end;
procedure TMyThread.MsgПроснись(var message: TMessage);
begin
//ба !! на самом деле нас разбудили не зря - чего-то хотят из-под нас ..
MessageBox(0, "Угу .. глазки продрали ... что надо ?", "", mb_ok);
end;
..
//где-то в ином потоке пробуждаем MyThread-поток - заспался он ... пора делом заняться ...
PostThreadMessage(MyThread.ThreadId, TM_ПРОСНИСЬ, 0, 0);
← →
Игорь Шевченко © (2004-03-24 13:30) [2]
> В форуме неоднократно высказывалась мысль о том, что
> TThread.Suspend и TThread.Resume - проктологический способ
> остановки-старта потока и что лучше пользоваться отправкой
> сообщения потоку.
Ламеров кругом хватает, если всех слушать...
← →
Игорь Шевченко © (2004-03-24 13:35) [3]А для синхронизации потоков используются объекты синхронизации, как ни странно, Critical Sections, Events, Semaphores, и т.п., в зависимости от задачи. Может, имелась в виду именно синхронизация ?
← →
Юрий Зотов © (2004-03-24 13:44) [4]Спокойно можете использовать Suspend/Resume.
← →
Vuk © (2004-03-24 13:51) [5]Правда, нужно учитывать, что после Suspend для корректного завершения потока нужно будет делать Resume. Иногда вместо suspend/resume можно использовать то, что предложил Digitman или, как вариант, ожидание события при помощи WaitForXXXX
← →
Digitman © (2004-03-24 14:03) [6]
> Timego
еще универсальней способ с "усыплением" потока вызовом MsgWaitForMultipleObjects
при этом "спящий" поток приобретает способность немедленно реагировать как на сообщения, адресованные ему и его окнам, так и на сигналы 6-ти с лишним десятков объектов синхронизации
PostThreadMessage(MyThread, TM_ДЕЛАЙ_ТО, ...);
PostThreadMessage(MyThread, TM_ДЕЛАЙ_СЕ, ...);
SendMessage(SomeThreadWindow, ...)
SetEvent(SomeSyncEvent);
ReleaseSemaphore(SomeSemaphore, ..);
ReleaseMutex(SomeMutex);
CloseHandle(SomeSyncObj);
и т.д. и т.п.
PostThreadMessage(MyThread, TM_ЗАКРУГЛЯЙСЯ_ПОРА_УМИРАТЬ, ...);
на все это "спящий" за неимением дела поток будет реагировать именно в нужное время
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.044 c