![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
драсте мне нужно выполнить определеную операцию после определеного времени простоя
я это реализовал вот так Код:
const tp = 3; {время простоя}
var
tda : DWord;
liInfo: TLastInputInfo;
function Ida : DWord;
var a : integer;
begin
a := (tda - liInfo.dwTime) DIV 60000;
Result := a;
end;
procedure Form.Timer1Timer(Sender: TObject);
var t : DWord;
begin
tda := GetTickCount;
liInfo.cbSize := SizeOf(TLastInputInfo);
GetLastInputInfo(liInfo);
t := Ida;
if t = tp then
{действие при простое}
endпосле того как приходит время действия при простое действие запускаеться каждый раз при входе в таймер а мне нужно шоб после действия таймер простоя начал отщет заново Последний раз редактировалось lmikle, 03.02.2016 в 19:01. |
|
#2
|
||||
|
||||
|
Это делается несколько иначе. Надо работать с событием procedure ApplicationOnIdle(Sender: TObject; var Done: Boolean);
Попробую скинуть попозже рабочий примерчик. Последний раз редактировалось Страдалецъ, 03.02.2016 в 11:19. |
|
#3
|
||||
|
||||
|
пример выполняет действие через 5 сек. после бездействия и повторяет выполнять действие каждые 5 сек. если бездействие продолжается:
Код:
unit Unit1;
interface
uses
Math,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, AppEvnts, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
ApplicationEvents1: TApplicationEvents; (* OnIdle *)
procedure ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
TickCount: DWORD = 0;
implementation
{$R *.dfm}
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
var
LastInputInfo: TLastInputInfo;
begin
LastInputInfo.cbSize:=SizeOf(TLastInputInfo);
GetLastInputInfo(LastInputInfo);
if LastInputInfo.dwTime<>TickCount then TickCount:=Max(TickCount, LastInputInfo.dwTime);
if GetTickCount-TickCount>5000 then
begin
TickCount:=GetTickCount;
(* to do *)
Memo1.Lines.Add('*');
end;
end;
end. |
| Этот пользователь сказал Спасибо NumLock за это полезное сообщение: | ||
SKIPtr (03.02.2016)
| ||
|
#4
|
||||
|
||||
|
Цитата:
http://www.delphisources.ru/pages/so...e-monitor.html |
|
#5
|
|||
|
|||
|
Цитата:
если меня б меня устраивал тот вариант я бы не искал доругова вот NumLock посоветовал по существу я уже думал о том шо тут нужен промежуточный буфер но пока в голову не лезло как это реализовать а тут пример прям в точку |
|
#6
|
||||
|
||||
|
Цитата:
![]() |
|
#7
|
|||
|
|||
|
кстате я уже давно не использую Application.Idle
потому шо когда я раньше это использовал заметил шо процес у которого используют Idle сильно грузит систему поэтому я стараюсь Idle заменять на таймер и еще я не проверял но мне кажеться Idle следит за простоем в Application а не в системе(скажите шо это не так) а мне нужен не чистый простой а больше бездействие пользователя потому што програма должна щитать время например отщитывать пол часа простоя а в это время ком должен транслировать ТВ передачи |