|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Поток + Set|KillTimmer
Подскажите в чем может быть проблема.
Обработчик таймера Код:
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? Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |
#3
|
|||
|
|||
Цитата:
Я уже и через Property пробовал и все равно при втором проходе возвращает True. Хотя, по логике, если там True, то я бы уперся в крит. секцию. Неужели нужно паузу ставить в момент смены флага? |
#4
|
||||
|
||||
Цитата:
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. Последний раз редактировалось 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 где должен происходить? в основном или доп потоке?
Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |