Конференция "Основная" » Проблема с таймером
 
  • mr. Eof (10.03.08 23:22) [0]
    Здравствуйте.

    Подскажите, как можно запускать в программе выполнение функций по истечению определенного врмени?
    Тоесть, мне надо выполнять набор неких действий каждые 10 секунд.

    !!! Использовать стандартный компонент таймер я не могу !!!

    Я пытался так:
    program time;
    {$APPTYPE CONSOLE}
    //---------------------------------------------
    uses Windows, SysUtils, Messages;
    //---------------------------------------------
    var
    Hour1,Min1,Sec1,Hour2,Min2,Sec2: integer;
    Time1,Time2: SystemTime;
    //---------------------------------------------
    begin
     while True do
       begin
         GetLocalTime(Time1);
         Hour1:= Time1.wHour;
         Min1:= Time1.wMinute;
         Sec1:= Time1.wSecond;
         while True do
           begin
             GetLocalTime(Time2);
             Sec2:= Time2.wSecond;
             if (Sec1+10 = Sec2) then
               begin
                 writeln(inttostr(Hour1)+':'+inttostr(Min1)+':'+inttostr(Sec1));
                 break;
               end;
           end;
       end;
    end.



    Данный вариант бесспорно хорош)), однако грузит процессор под 100% и тд...
    Подскаите выход?
  • DVM © (10.03.08 23:25) [1]

    > Использовать стандартный компонент таймер я не могу

    можешь тот, что устанавливается через API функцию SetTimer. Там есть вариант без окон. Через функцию обратного вызова.
  • Лабух (10.03.08 23:25) [2]
    Почему нельзя использовать стандартный компонент?
  • DVM © (10.03.08 23:28) [3]

    > Данный вариант бесспорно хорош)), однако грузит процессор
    > под 100% и тд...

    sleep(1000 или даже 5 или 0) вставь в цикл.
  • DVM © (10.03.08 23:29) [4]

    > Почему нельзя использовать стандартный компонент?

    Потому что очевидно у него консольная программа.
  • mr. Eof (10.03.08 23:35) [5]
    Да, программа действительно консольная.
    Сейчас попробую с SetTimer.
    Спасибо всем за ответы!
  • mr. Eof (10.03.08 23:41) [6]
    А что вообще наиболее эввективно (по отношению к ресурсам ПК) использовать?
    SetTimer или sleep??
  • DVM © (10.03.08 23:48) [7]
    пока у тебя будет цикл, без sleep (или чего то подобного) тебе все равно не обойтись. Иначе цикл будет крутиться максимально быстро и отожрет все процессорное время.
  • mr. Eof (10.03.08 23:51) [8]
    Да, я согласен.
    А как ты думаешь, что будет легче??
    Sleep с бесконечным циклом:
     while True do
       begin
         sleep(10000);
         writeln('Bingo!');
       end;



    Или SetTimer (рабочего примера пока нет =) ).
  • DVM © (10.03.08 23:54) [9]

    > А как ты думаешь, что будет легче??

    Это ловля блох. Sleep(10000) ясное дело будет легче легкого (на микроскопическую величину), и займет меньше системных ресурсов, чем установка таймера.
  • mr. Eof (10.03.08 23:55) [10]
    Спасибо. Это интересно.
    В таком случае буду использовать Sleep.
  • DVM © (10.03.08 23:56) [11]

    > В таком случае буду использовать Sleep.

    но с таймером оно правильнее :) Sleep - это своего рода костыль.
  • mr. Eof (10.03.08 23:57) [12]
    а у тебя нет рабочего примера с SetTimer ??
    что то я внятного не нашел..
  • DVM © (11.03.08 00:05) [13]

    program Project1;

    {$APPTYPE CONSOLE}

    uses
     windows, messages, SysUtils;

    procedure TimerProc(wnd: HWND; uMsg:UINT; idEvent: UINT; dwTime: DWORD); stdcall;
    begin
     windows.Beep(500,50);
    end;

    var

    Mesg : TMsg;

    begin
     SetTimer(0, 100, 1000, @TimerProc);
     While GetMessage(Mesg,0,0,0) do
     begin
       TranslateMessage(Mesg);
       DispatchMessage(Mesg);
     end
    end.


  • mr. Eof (11.03.08 00:10) [14]
    Работает, спасибо =)
  • Elec3C © (11.03.08 00:19) [15]
    При завершении программы желательно KillTimer.
  • mr. Eof (11.03.08 00:20) [16]
    Спасибо, я добавлю
  • Leonid Troyanovsky © (11.03.08 15:53) [17]

    > mr. Eof   (11.03.08 00:10) [14]

    > Работает, спасибо =)

    Будет ошибкой проектирования.

    --
    Regards, LVT.
  • DVM © (11.03.08 22:22) [18]

    > Leonid Troyanovsky ©   (11.03.08 15:53) [17]

    Почему? Смущает цикл сообщений в консольном приложении без окон? Так цикл сообщений он не только для окон нужен. А цикл там будет в любом случае, так почему бы не использовать цикл ообщений.
  • Leonid Troyanovsky © (11.03.08 23:19) [19]

    > DVM ©   (11.03.08 22:22) [18]

    > Почему? Смущает цикл сообщений в консольном приложении без
    > окон?

    Смущает смешение парадигм (или подсистем).

    Одна - обработка потоков (streams) символов, а вторая - обработка
    неупорядоченного ввода (GUI).

    А если делиться на два разнородных потока (threads), то консольное приложение полностью лишится своей (возможной) привлекательности.
    В качестве примера можно представить, хотя бы, неуклюжесть
    реакции, скажем, на завершение такого приложения или всей сессии.

    Для GUI приложения консольные включения (типа AllocConsole) также выглядят некими франкенштейнами, но, при желании, можно сделать
    подобные черты и более цивилизованными.

    Резюме: или делать в консоли второй поток с Waitable Timer, или делать
    обычное GUI приложение (с окном верхнего уровня).
    Ну, и возможны некие компромиссы, скажем, поручать периодические
    действия Schedule.

    --
    Regards, LVT.
 
Конференция "Основная" » Проблема с таймером
Есть новые Нет новых   [134483   +44][b:0][p:0.002]