![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Правильно завершить ожидающий поток [D7, WinXP]
Dmitry_177 © (2007-04-19 17:37:00)Создал поток, который используется в качестве будильника и с момента его срабатывания с определенным периодом должно что-то происходить, так:
function ThreadTimer(Param: Pointer): DWORD; stdcall;
begin
while true do
begin
WaitForSingleObject(hTimer, INFINITE);
// действия
end;
end;
...
hTimer := CreateWaitableTimer(nil, false, nil);
SetWaitableTimer(hTimer, TLargeInteger(fTime), Period, nil, nil, false);
CloseHandle(CreateThread(nil, 0, @ThreadTimer, nil, 0, idThread));
Но вопрос в том, как правильно остановить этот ThreadTimer? Ведь пользователь может сменить время срабатывания или период..
GrayFace (2007-04-23 14:07:00) [1]Создать Event и ждать его вместе с WaitableTimer'ом. А еще можно обойтись без WaitableTimer'а:
WaitForSingleObject(hEvent, 100{интервал таймера}). Только точность отсчета времени может пострадать.
Leonid Troyanovsky (2007-04-19 19:02:00) [2]
> Dmitry_177 (19.04.07 17:40) [1]
> правильно ли это? Больше всего меня волнует правильно ли
> то что при CloseHandle(hTimer); функция WaitForSingleObject
> завершится?
If this handle is closed while the wait is still pending, the function's behavior
is undefined.
В качестве решения можно избрать WaitForMultipleObjects
или WaitForSingleObjectEx. RTFM: msdn.
--
Regards, LVT.
Dmitry_177 (2007-04-19 17:40:00) [3]Может в цикле while true doвместо true сделать флажек, например b: BOOL? И при изменении времени выставить флажек и выполнить CloseHandle(hTimer); тогда по идее WaitForSingleObject прекратит работу и при измененном флажке цикл прекратится и поток сам завершит свою работу.. Но это я только предложил, правильно ли это? Больше всего меня волнует правильно ли то что при CloseHandle(hTimer); функция WaitForSingleObject завершится?