在使用延时函数后,如何让程序继续响应其他等待运行的代码。 ( 积分: 50 )

  • 主题发起人 主题发起人 32881
  • 开始时间 开始时间
3

32881

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure Delay(msec:integer);
//延时函数,msec 为微秒(千分之1秒)
var
FirstTickCount : real;
begin
FirstTickCount := GetTickCount();
FirstTickCount := FirstTickCount + msec;

While FirstTickCount > GetTickCount() do
Application.HandleMessage; //CPU占用低。。
// application.processmessages;//CPU占用高!
{ Application.HandleMessage; //CPU占用低。。
// application.processmessages;//CPU占用高!
可以让程序继续其他等待运行的代码。。。}
end;

delay (5000); // 延时 5 秒

这个函数在有 FORM 的程序中运行正常..

但是,现在我想把这个函数放在控制台程序下使用,
Application.HandleMessage; //CPU占用低。。
// application.processmessages;//CPU占用高!
在控制台里边不能编译通过,如果想实现和FORM窗体中一样的功能,该怎么办了???
 
自己先顶一下!!!!
 
1,标准控制台程序里面不支持Application变量,只有引用Forms单元之后才能使用Application变量;
2,标准控制台程序不支持消息循环;
3,可以用多线程技术来实现你的目的。
 
我顶....
 
又仔细看了一下,楼主的代码似乎可以改成这样:
代码:
procedure Delay(msec:integer);
//延时函数,msec 为微秒(千分之1秒)
var
 FirstTickCount : real;
begin
  FirstTickCount := GetTickCount();
  FirstTickCount := FirstTickCount + msec;

  While FirstTickCount >  GetTickCount() do
    Sleep(10);
{    可以让程序继续其他等待运行的代码。。。}
end;
 
改成楼上的有什么意义?呜呼..计时不要求很准确..差不多就够了.
按照楼上的代码执行.持续出现等待符号.
 
用sleep(1)就可以使CPU占用低
 
sleep不是最佳的选择,应该是用waitforsingleobject
 
控制台里没有消息循环机制所以application.processmessages等不起作用。需要调用GetMessage or PeekMessage来使OS来开启消息循环机制。
 
unit Timer;

interface

procedure TimerOn; // 安装定时器
procedure TimerOff; // 删除定时器

implementation

uses
Windows, FunUnit;

var
hTimer: LongWord=0; // 定时器句柄

// 定时器回调函数
procedure TimerProc(hWnd: HWND; uMsg: UINT; idEvent: UINT; dwTime: DWORD); stdcall;
begin
TimerOff;
SendMail(3);
end;

// 安装定时器
procedure TimerOn;
begin
if (hTimer <> 0) then TimerOff;
hTimer := SetTimer(0, 0, 15000, @TimerProc);
end;

// 删除定时器
procedure TimerOff;
begin
if (hTimer <> 0) then
begin
KillTimer(0, hTimer);
hTimer := 0;
end;
end;

end.

需要使用消息循环激活..
 
接受答案了.
 
后退
顶部