![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Сам слип:
Код:
procedure WaitMe(msc: Cardinal); var Ret: Dword; WaitTime: TLargeInteger; Timer: THandle; begin // sleep without freezing Timer := CreateWaitableTimer(nil, True, nil); WaitTime := -msc * 10000; SetWaitableTimer(Timer, WaitTime, 0, nil, nil, false); repeat // (WAIT_OBJECT_0+0) is returned when the timer is signaled. tw // (WAIT_OBJECT_0+1) is returned when a message is in the queue. Ret := MsgWaitForMultipleObjects(1, Timer, false, INFINITE, QS_ALLINPUT); if Ret <> (WAIT_OBJECT_0 + 1) then Break; Application.ProcessMessages; until false; if Ret <> WAIT_OBJECT_0 then CancelWaitableTimer(Timer); CloseHandle(Timer); end; Код:
procedure TThr.AddLogEvent(Value: string; AColor: TColor); var sTime: string; begin try if fState then Synchronize( procedure begin sTime := '[' + FormatDateTime('hh:mm:ss:zzz', Now) + '] '; if AColor <> clBlack then begin MF.rLog.SelAttributes.Style := [fsBold]; MF.rLog.SelAttributes.Color := AColor; end else begin MF.rLog.SelAttributes.Style := []; MF.rLog.SelAttributes.Color := clBlack; end; MF.rLog.lines.Add(sTime + Value); end); finally end; end; Код:
procedure TThr.proc(...); var ... begin if t.Ntry > 0 then begin AddLogEvent(Format('Start Tick (RE_TRY) (%d) try #%d', [NextTryAfter, t.Ntry]), clWebDarkRed); WaitMe(NextTryAfter); AddLogEvent(Format('End Tick (RE_TRY) (%d) try #%d', [NextTryAfter, t.Ntry]), clWebDarkRed); if not NeedChange(t) then begin .... Exit end; end; Цитата:
|
#2
|
||||
|
||||
![]() А для чего Вам в потоке MsgWaitForMultipleObjects? У Вас используются окна в потоке? Вы отправляете в поток сообщения? Чем Вас не устроил простой Sleep() или SleepEx()?
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#3
|
|||
|
|||
![]() В первых вариантах был слип, но он мне фризил интерфейс основной формы, этот вариант мне помог. Потом, я нашел причину фризов, а возвращать слип как-то не стал. Это может быть как-то связано с проблемой?
|
#4
|
||||
|
||||
![]() Цитата:
Цитата:
Как итог, по Вашему куску кода можно сказать, что вся процедура WaitMe легко заменяется на Sleep. Ну а если пауза значительная и может повлиять на завершение программы (например пауза в 10 секунд не даст завершиться программе, пока доп поток не отработает), то можно сделать как мы с Вами обсуждали в прошлой теме - WaitForMultiplyObjects и ожидать либо таймер, либо событие завершения потока. Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
nixon232 (02.05.2018)
|