Текущий архив: 2007.10.21;
Скачать: CL | DM;
ВнизПравильно завершить ожидающий поток Найти похожие ветки
← →
Dmitry_177 (2007-04-19 17:37) [0]Создал поток, который используется в качестве будильника и с момента его срабатывания с определенным периодом должно что-то происходить, так:
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? Ведь пользователь может сменить время срабатывания или период..
← →
Dmitry_177 (2007-04-19 17:40) [1]Может в цикле while true do вместо true сделать флажек, например b: BOOL? И при изменении времени выставить флажек и выполнить CloseHandle(hTimer); тогда по идее WaitForSingleObject прекратит работу и при измененном флажке цикл прекратится и поток сам завершит свою работу.. Но это я только предложил, правильно ли это? Больше всего меня волнует правильно ли то что при CloseHandle(hTimer); функция WaitForSingleObject завершится?
← →
Leonid Troyanovsky © (2007-04-19 19:02) [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.
← →
GrayFace © (2007-04-23 14:07) [3]Создать Event и ждать его вместе с WaitableTimer"ом. А еще можно обойтись без WaitableTimer"а:
WaitForSingleObject(hEvent, 100{интервал таймера})
. Только точность отсчета времени может пострадать.
Страницы: 1 вся ветка
Текущий архив: 2007.10.21;
Скачать: CL | DM;
Память: 0.44 MB
Время: 0.046 c