Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: OnTimer: выключить таймер внутри обработки этого события реально?  (Прочитано 9023 раз)
0 Пользователей и 1 Гость смотрят эту тему.
malor
Опытный

ru
Offline Offline

« : 16-11-2011 07:06 » 

Хочу остановить работу таймера внутри
TMainForm.Timer1Timer(Sender: TObject);

Но т.к. мессиджы плодятся каждую прошедшую минуту бездействия, то и возник вопрос - что ж он не остановится?
Код: (Delphi)
const IDLE_INTERVAL = 60000;        // Минута бездействия

function LastInput(): DWord;
var
  LInput: TLastInputInfo;
begin
  LInput.cbSize := SizeOf(TLastInputInfo);
  GetLastInputInfo(LInput);
  Result := GetTickCount - LInput.dwTime;
end;

procedure TMainForm.Timer1Timer(Sender: TObject);
begin

 if (Round(LastInput) >= IDLE_INTERVAL) then
   begin
     MainForm.Visible := false;
     ShowMessage('Не было активности более минуты!');
     Timer1.Enabled := false;
     FinishSession();       // Какие-то действия
   end;

end;
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 16-11-2011 07:13 » 

задача непонятна

а остановить таймер конечно же можно и внутри обработчика
Записан

malor
Опытный

ru
Offline Offline

« Ответ #2 : 16-11-2011 07:15 » 

Если человек не проявлял активности за компом, то выдать сообщение на экран.

Можно? А что тогда не останавливается выдача мессиджбоксов?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 16-11-2011 07:20 » 

в обработчике показать окно, остановить таймер. Когда активность проявится, скрыть окно и запустить таймер

также, в обработчике смотреть - если была активность, то ничего не делать
Записан

malor
Опытный

ru
Offline Offline

« Ответ #4 : 16-11-2011 07:26 » 

Проблема заключалась в том что в коде
    ShowMessage('Не было активности более минуты!');
     Timer1.Enabled := false;


мы останавливаемся на строке ShowMessage() и тем самым переход к непосредственному отключению таймера строкой
    Timer1.Enabled := false;
не был осуществлен. Так ?

Может просто их поменять местами?
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 16-11-2011 07:41 » 

ShowMessage - это же модальное окно. Перед ним, ага, отключи, а то новые сообщения таймера в очереди накопятся
Записан

DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #6 : 16-11-2011 10:49 » 

Алексей1153++, не уверен, но таймерные сообщения в очередь вроде не идут. Кажецца ....

malor, а зачем использовать ShowMessage() - модальное, если можно выдать инф в поле формы.
Или вызывать свой диалог со своим уже управлением ?
Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 16-11-2011 11:40 » 

DneprSMV, проверь Улыбаюсь Расскажи. Я помню так, что идут
Записан

x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #8 : 16-11-2011 12:41 » 

это в принципе хреновая затея - из таймера диалоговые окна показывать. лучше зарегестрировать свою мессагу, WM_APP + 10, какой-нибудь, и из таймера слать его приложению. а приложение пускай обрабатывает мессагу и окна показывает, таймер к тому времени уже будет стоять при любых раскладах.
Записан

DneprSMV
Помогающий

kz
Offline Offline
Пол: Мужской

« Ответ #9 : 17-11-2011 12:46 » 

Алексей1153++,
если таймер на базе WM_TIMER, то вроде как в очередь идет только первое.
(вроде логично, если приложение не забирает вовремя таймерные сообщения, то если они накопятся, какой в них смысл - они ведь уже "не актуальны" в смысле привязки к временным интервалам).
Я в WinAPI только около года, где-то попадалось, надо "перечитать пейджер" и "много думаль", не помню где  Улыбаюсь
---
ps - "не так выразилось". Имелось ввиду что очередь для таймера имеет длину 1.
« Последнее редактирование: 17-11-2011 13:52 от DneprSMV » Записан

"Не слушайте никаких советов, в том числе и этот" (Сократ ?)
x77
Модератор

ro
Offline Offline
Пол: Мужской
меняю стакан шмали на обратный билет с Марса.


« Ответ #10 : 17-11-2011 13:20 » 

DneprSMV, именно так. дельфийский таймер дергает апи-шный SetTimer, а дальше

Код: (Delphi)

  with Msg do
    if Msg = WM_TIMER then
      try
        Timer;
      except
        Application.HandleException(Self);
      end
    else
      Result := DefWindowProc(FWindowHandle, Msg, wParam, lParam);
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 18-11-2011 02:50 » new

Имелось ввиду что очередь для таймера имеет длину 1.

ну оно так само собой получится - если новое сообщение придёт тогда, когда ты в обработчике, то оно выполнится сразу после выхода из обработчика. Поток то один )
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines