void idle( DWORD dwTimeout,
DWORD dwTimeInterval = 1)
{
MSG msg;
DWORD dwTimeNext = GetTickCount() + dwTimeout;
// Wait time next.
while (GetTickCount() < dwTimeNext)
{
Sleep(dwTimeInterval);
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
在Delphi下面有对应的吗?
Sleep()API是不行的,会堵塞其它的消息处理.有什么解决方案吗?
DWORD dwTimeInterval = 1)
{
MSG msg;
DWORD dwTimeNext = GetTickCount() + dwTimeout;
// Wait time next.
while (GetTickCount() < dwTimeNext)
{
Sleep(dwTimeInterval);
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
}
在Delphi下面有对应的吗?
Sleep()API是不行的,会堵塞其它的消息处理.有什么解决方案吗?
OnButtonClick()
{
Sleep(100000);}
但是整个窗口别的消息还可以处理,明显,Sleep是堵塞的.
触发该函数后,100秒后返回,在这100秒期间,别的窗口消息不会堵塞
var
TimeNext : DWord;
begin
TimeNext := GetTickCount() + TimeOut;
while(GetTickCount() < TimeNext)do
begin
Application.ProcessMessages ;
end;
end;
这样不是很好!造成太高的CPU占有量。应该还有更好的方法。
TIdleStruct = record
ThrdId: THandle;
WaitTick: Cardinal;
Waiting: Boolean;
end;
PIdleStruct = ^TIdleStruct;procedure Idle(Tick: Cardinal);
var
Info: TIdleStruct;
Unused: Integer;
Msg: TMessage; function IdleFunc(Info: PIdleStruct): Integer; stdcall;
begin
sleep(Info.WaitTick);
Info.Waiting := false;
PostThreadMessage(Info.ThrdId, WM_USER, 0, 0);
result := 0;
end;begin
Info.ThrdId := GetCurrentThreadId;
Info.WaitTick := Tick;
Info.Waiting := True;
CreateThread(nil, 0, @IdleFunc, @Info, 0, Unused);
while Info.Waiting and GetMessage(Msg, 0, 0, 0) do
try
TranslateMessage(msg);
DispatchMessage(msg);
except
end;
end;
var
Msg: TMessage应当改成 Msg: TMsg;
其中的事件:
procedure TForm1.ApplicationEvents1Idle(Sender: TObject; var Done: Boolean);
beginend;应该就是你要的
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure MyIdle(Sender: TObject; var Done: Boolean);
public
count:integer;
end;var
Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnIdle:=MyIdle;
end;procedure TForm1.MyIdle(Sender: TObject; var Done: Boolean);
begin
Inc(count);
Caption:=IntToStr(count);
end;end.
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
不用delphi给你提供的Application.OnIdle事件自己写只要上面那三句在,怎么写都是可以的