![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
Подскажите в чем может быть проблема.
Обработчик таймера Код:
procedure TЬForm.WMTimer(var Msg: TWMTimer);
begin
try
try
Thr.initWork(Msg.TimerID);
// ShowMessage(BoolToStr(KillTimer(Self.Handle, msg.TimerID), True));
Msg.Result := 0;
except
end;
finally
KillTimer(Handle, Msg.TimerID);
inherited;
end;
end;Код:
begin
FLock.Enter;
try
if not FOnTime then
begin
fOnTime:=True;
....
fOnTime:=false;
end;
finally
FLock.Leave
end;
end;Код:
[14:11:42:253] Add Worker: Id: 1, Time: 7000 [14:11:42:759] Add Worker: Id: 2, Time: 8500 [14:11:43:264] Add Worker: Id: 3, Time: 10500 Последний раз редактировалось nixon232, 14.04.2018 в 15:26. |
|
#2
|
||||
|
||||
|
По Вашему коду остается только догадываться, что Вы пытаетесь сделать.
Могу предположить, что используется один дополнительный поток Thr и для него инициализирована одна критическая секция FLock. Для чего Вам FOnTime, и FLock? |
|
#3
|
|||
|
|||
|
Цитата:
Я уже и через Property пробовал и все равно при втором проходе возвращает True. Хотя, по логике, если там True, то я бы уперся в крит. секцию. Неужели нужно паузу ставить в момент смены флага? |
|
#4
|
||||
|
||||
|
Цитата:
Последний раз редактировалось dr. F.I.N., 15.04.2018 в 18:12. |
|
#5
|
|||
|
|||
|
Цитата:
Сам поток правда в цикле крутится с такой паузой в цикле Код:
...
begin
while not Terminated do
begin
case WaitForMultipleObjects(2, @FHandles[0], False, INFINITE) of
WAIT_FAILED:
RaiseLastOsError;
WAIT_OBJECT_0:
Terminate;
WAIT_OBJECT_0 + 1:
begin
WaitMe(400);
...Код:
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
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;Код:
type
TThr= class(TThread)
private
FHandles: array[0..1] of THandle;
FLock: TCriticalSection;
fOnTime: Boolean;
...
procedure TThr.InitWork(id: Cardinal);
begin
FLock.Enter;
try
if not FOnTime then
begin
fOnTime:=True;
....
fOnTime:=false;
end;
finally
FLock.Leave
end;
end;Код:
Thr.initWork(1);/// fONTime =false, все ок, заходим, меняем флаг, работаем, меняем обратно Thr.initWork(2);/// fONTime =true Последний раз редактировалось nixon232, 15.04.2018 в 19:24. |
|
#6
|
||||
|
||||
|
Есть подозрение, что в основном потоке вы вызываете метод объекта Thr. InitWork где должен происходить? в основном или доп потоке?
|