У меня есть обработчик OnIdle в моем приложении D2006. С этим кодом:
procedure TMainForm.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
begin
Inc (IdleCalls) ;
Sleep (10) ;
Done := False ;
end ;
приложение работает без сбоев, обработчик простоя вызывается 100 раз в секунду, а загрузка ЦП близка к нулю.
Затем я добавил TActionList и подключил некоторые элементы управления к действиям, закодировал обработчик Execute и Update.
procedure TMainForm.ActionNewButtonExecute(Sender: TObject);
begin
DoNewProject ;
end ;
procedure TMainForm.ActionNewButtonUpdate(Sender: TObject);
begin
ActionNewButton.Enabled := AccessLevelIsSupervisor ;
end;
Проблема. Событие OnUpdate не срабатывает. По наитию я установил Done := true в обработчике OnIdle, и тогда обработчик OnIdle вызывается только при перемещении мыши. И действие «Обновить» по-прежнему не срабатывает.
Почему обработчик обновления может не срабатывать и следует ли установить для параметра «Готово» значение true или false? Или оба?
Sleep
в OnIdle — это ужасная вещь — она вызывает разбрызгивание или сбои в пользовательском интерфейсе.) - person Ken White   schedule 01.04.2011Sleep
всегда плохая идея, если для этого нет абсолютного требования; есть причина, по которой Windows и другие ОС поддерживают несколько потоков выполнения. Таким образом, фоновая обработка может выполняться в фоновом режиме, а не в потоке пользовательского интерфейса. А что произойдет, если пользователь переместит мышь так же, как вызывается OnIdle? Существует задержка перед обработкой события мыши. Глюк. - person Ken White   schedule 01.04.2011Label1.Caption := 'something'; Label1.Update;
, либо используя синхронизацию из потока, как вы сказали. Если вы обновляете UI чаще, чем раз в секунду, вы, скорее всего, уже тратите слишком много времени; пользователь все равно не может следить за этим. Я не знаю, почему это продолжается здесь; @David и я оба советовали темы, что это совершенно отдельная тема, и в комментариях нет места для их обсуждения. Пожалуйста, задайте новый вопрос. - person Ken White   schedule 01.04.2011