Показать сообщение отдельно

  #3267  
Старый 12.04.2009, 10:54
art2222
Участник форума
Регистрация: 28.04.2008
Сообщений: 172
С нами: 9492347

Репутация: 270
По умолчанию

Цитата:
подскажите как сделать чтобы через заданный промежуток времени программа выполняла команды,но без TTimer а.например через каждые 3 часа отправляла лог или проверяла подключен ли интернет или размер файла лога.....
Класс

Код:
unit WaitThread;

interface

uses Classes, Windows;

type
TWaitThread = class(TThread)
   WaitUntil: TDateTime;
   procedure Execute; override;
end;

implementation

uses SysUtils;

procedure TWaitThread.Execute;
var
Timer: THandle;
SystemTime: TSystemTime;
FileTime, LocalFileTime: TFileTime;
begin
Timer := CreateWaitableTimer(NIL, FALSE, NIL);
try
   DateTimeToSystemTime(WaitUntil, SystemTime);
   SystemTimeToFileTime(SystemTime, LocalFileTime);
   LocalFileTimeToFileTime(LocalFileTime, FileTime);
   SetWaitableTimer(Timer, TLargeInteger(FileTime), 0, 
     NIL, NIL, FALSE);
   WaitForSingleObject(Timer, INFINITE);
finally
   CloseHandle(Timer);
end;
end;

end.
Использовать можно так:

Код:
type
TForm1 = class(TForm)
   Button1: TButton;
   procedure Button1Click(Sender: TObject);
private
   procedure TimerFired(Sender: TObject);
end;

//.....

implementation

uses WaitThread;

procedure TForm1.Button1Click(Sender: TObject);
var
T: TDateTime;
begin
with TWaitThread.Create(TRUE) do
begin
   OnTerminate := TimerFired;
   FreeOnTerminate := TRUE;
   // Срок ожидания закончится через 5 секунд
   WaitUntil := Now + 1 / 24 / 60 / 60 * 5;
   Resume;
end;
end;

procedure TForm1.TimerFired(Sender: TObject);
begin
	ShowMessage('Timer fired !');
end;
(c) DRKB
 
Ответить с цитированием