![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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()?
|
|
#3
|
|||
|
|||
|
В первых вариантах был слип, но он мне фризил интерфейс основной формы, этот вариант мне помог. Потом, я нашел причину фризов, а возвращать слип как-то не стал. Это может быть как-то связано с проблемой?
|
|
#4
|
||||
|
||||
|
Цитата:
Цитата:
Как итог, по Вашему куску кода можно сказать, что вся процедура WaitMe легко заменяется на Sleep. Ну а если пауза значительная и может повлиять на завершение программы (например пауза в 10 секунд не даст завершиться программе, пока доп поток не отработает), то можно сделать как мы с Вами обсуждали в прошлой теме - WaitForMultiplyObjects и ожидать либо таймер, либо событие завершения потока. |
| Этот пользователь сказал Спасибо dr. F.I.N. за это полезное сообщение: | ||
nixon232 (02.05.2018)
| ||