Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Вниз

таймер для консоли   Найти похожие ветки 

 
dimm ©   (2005-02-09 22:50) [0]

нужен таймер для консоли. аналог вообшем TTimer,
делал через GetTicKCount в цикле, но через некоторое время он сбивался.
если у кого есть исходник или идея. буду признателен.


 
Alexander Panov ©   (2005-02-09 22:59) [1]

См. простейший пример:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls,ExtCtrls;

type
 TProcedureCallBackSimpleTimer=procedure(Sender: TObject);

 TSimpleTimer=class(TThread)
   FCS: RTL_CRITICAL_SECTION;
   FEvent: THandle;
   FInterval: Integer;
   FEnabled: Boolean;
   FOnTimer: TProcedureCallBackSimpleTimer;
   FCheckSuspended : Boolean;
 private
   procedure Timer;
   procedure SetEnabled(const aEnabledTimer: Boolean);
   procedure SetCallback(const Proc:TProcedureCallBackSimpleTimer);
 protected
   procedure Execute;override;
 public
   constructor Create;
   destructor Destroy;override;

   property Interval: Integer read FInterval write FInterval;
   property Enabled: Boolean read FEnabled write SetEnabled;
   property OnTimer: TProcedureCallBackSimpleTimer
               write SetCallback;
 end;

 TForm1 = class(TForm)
   Button1: TButton;
   Memo1: TMemo;
   Button2: TButton;
   Button3: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 TT: TSimpleTimer;

implementation

{$R *.dfm}

constructor TSimpleTimer.Create;
begin
 inherited Create(True);
 FEvent := CreateEvent(nil,True,False,nil);
 if FEvent=0 then raise Exception.Create("Error!");
 FEnabled := False;
 FInterval := 1000;
 FOnTimer := nil;
 FCheckSuspended := False;
 InitializeCriticalSection(FCS);
 FreeOnTerminate := True;
end;

destructor TSimpleTimer.Destroy;
begin
 CloseHandle(FEvent);
 DeleteCriticalSection(FCS);
end;

procedure TSimpleTimer.Timer;
begin
 if Assigned(FOnTimer) then
 begin
   EnterCriticalSection(FCS);
   FOnTimer(Self);
   LeaveCriticalSection(FCS);
 end;
end;

procedure TSimpleTimer.Execute;
begin
 while not Terminated do
 begin
   if Terminated then Break;
   WaitForSingleObject(FEvent,FInterval);
   if FCheckSuspended then
   begin
     FCheckSuspended := False;
     Continue;
   end;
   Timer;
 end;
end;

procedure TSimpleTimer.SetEnabled(const aEnabledTimer: BOolean);
begin
 FEnabled := aEnabledTimer;
 if FEnabled
   then Resume
   else
   begin
     Suspend;
     FCheckSuspended := True;
   end;
end;

procedure TSimpleTimer.SetCallBack(const Proc:TProcedureCallBackSimpleTimer);
begin
 FOnTimer := Proc;
end;

procedure MCallBack(Sender: TObject);
begin
 Form1.Memo1.Lines.Add("Тик-Так");
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 TT := TSimpleTimer.Create;
 TT.Interval := 1000;
 TT.OnTimer := @MCallBack;
 TT.Enabled := True;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 TT.Enabled := not TT.Enabled;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 TT.Terminate;
end;

end.


 
Leonid Troyanovsky ©   (2005-02-09 23:35) [2]


> dimm ©   (09.02.05 22:50)  
> нужен таймер для консоли. аналог вообшем TTimer,


CreateWaitableTimer and so on.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2005-02-09 23:44) [3]


> Alexander Panov ©   (09.02.05 22:59) [1]
..
>  while not Terminated do
>  begin
>    if Terminated then Break;
>    WaitForSingleObject(FEvent,FInterval);


Если FInterval = INFINITE, то все приседания с Terminated
малополезны. Т.е., стоит сделать свой Terminate в котором
устанавливать FEvent. Ну, и, наверное, свой Destroy, бо
Terminate не виртуальный. И, в любом (не INFINITE) случае,
полезно анализировать результат  WaitForSingleObject.

--
Regards, LVT.



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.032 c
14-1109775929
Doxygen
2005-03-02 18:05
2005.03.20
Microsoft Word 2002


3-1108718048
}|{yk
2005-02-18 12:14
2005.03.20
Связывание таблиц


1-1110145219
Narik
2005-03-07 00:40
2005.03.20
Как перекинуть картинку из одного Image в другой???


1-1110145166
0x011001
2005-03-07 00:39
2005.03.20
Как получить?


1-1110145286
ХхХ
2005-03-07 00:41
2005.03.20
Minimize, Maxsimize...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский