计算机教程

当前位置:3522.com > 计算机教程 > 改进的延时函数Delay(使用MsgWaitForMultipleObjects等

改进的延时函数Delay(使用MsgWaitForMultipleObjects等

来源:http://www.4sports-uk.com 作者:3522.com 时间:2019-11-10 06:12

Delphi跨平台下的GetTickCount,GetCurrentThreadID,gettickcount

在Windows下只要uses Windows,就有这两个API可调用GetTickCount,GetCurrentThreadID

如果我们需要跨平台使用这两个函数,就不能仅仅Uses Windows了。

如果需要跨平台使用GetTickCount,可以uses System.Classes,然后使用类方法:TThread.GetTickCount

如果需要跨平台使用GetCurrentThreadID,则仅需引用不同的单元即可:

uses 
{$ifdef MSWINDOWS}
Windows;
{$endif}
{$ifdef POSIX}
Posix.Pthread;
{$endif}

  解决上一节中延时函数占CPU使用率(达50%)的第二种方法是利用消息机制,通过API函数MsgWaitForMultipleObjects等待消息或超时的到来,从而避免使用循环检测使CPU占用率过高。完整的改进版Delay函数代码如下:

delphi7的GetTickCount作用与用法

这个段程序是一个“延时”过程。
GetTickCount是返回一个DWORD类型,其返回的值是自系统启动以来所经历的时间,单位:毫秒。
此段代码基本原理就是:
先GetTickCount取值赋于Start_Time,然后不停的循环用GetTickCount来和Start_Time来相减,直到这个差值大于参数DelayTime则退出循环结束过程,从而达到延时的目的。为了不造成程序因此间循环而停止响应,故在循环中用了Application.ProcessMessage来手动使程序响应系统信息。  

 

delphi7怎实现按下一个按钮程序自动按顺序每500ms执行一项更改EditText值,有多个需更改项目

procedure Delay(dwMilliseconds: DWORD); //Longint
var
iStart, iStop: DWORD;
begin
iStart := GetTickCount;
repeat
iStop := GetTickCount;
Application.ProcessMessages;
until (iStop - iStart) >= dwMilliseconds;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
T:Tedit;
begin
for i := 1 to 3 do
begin
T:=Findcomponent('Edit' inttostr(i)) as TEdit;
if T<>nil then T.Text:='str' inttostr(i);
delay(500);
end;
ShowMessage('OK');
end;  

http://www.bkjia.com/Delphijc/877839.htmlwww.bkjia.comtruehttp://www.bkjia.com/Delphijc/877839.htmlTechArticleDelphi跨平台下的GetTickCount,GetCurrentThreadID,gettickcount 在Windows下只要uses Windows,就有这两个API可调用GetTickCount,GetCurrentThreadID 如果我们需要跨平...

[delphi] view plaincopyprint?

 

  1. procedure Delay(dwMilliseconds:DWORD);  
  2. var  
  3.   endTick: DWORD;  
  4.   Event: THandle;  
  5. begin  
  6. Timer1.Enabled:=False;  
  7. Event := CreateEvent(nil,False,False,nil);  
  8. try  
  9. endTick := GetTickCount dwMilliseconds;  
  10. while (dwMilliseconds > 0) and  
  11. (MsgWaitForMultipleObjects(1, Event, False,  
  12. dwMilliseconds, QS_ALLINPUT) = WAIT_OBJECT_0 1) do  
  13. begin //还在延时期间且有输入消息则执行下面的分发消息  
  14. Application.ProcessMessages;  
  15. dwMilliseconds := endTick-GetTickcount;  
  16. end;  
  17. finally  
  18. CloseHandle(Event); //关闭事件句柄,销毁事件对象  
  19. end;  
  20. Timer1.Enabled:=True;  
  21. end;  
  22. {用到的两个API函数}  
  23. //***********************************************************************  
  24. //函数:CreateEvent           //创建事件对象  
  25. //参数:lpEventAttributes=nil //默认的安全符  
  26. //      bManualReset=False    //自动复原:当事件被一个等待线程释放以后,  
  27. 3522.com,//                            //系统将会自动将事件状态复原为无信号状态  
  28. //      bInitialState=False   //指定事件对象的初始状态为无信号状态  
  29. //      lpName=nil            //无名对象  
  30. //返回值:事件对象句柄  
  31. //***********************************************************************  
  32.   
  33.   
  34. //**************************************************************************  
  35. //函数:MsgWaitForMultipleObjects  //等待直到返回条件满足则立即返回  
  36. //  
  37. //返回条件:①指定(信号)事件对象(第二个参数)中的一个或所有(第三个参数)对象发出信号  
  38. //(任意一个 ②指定的等待/超时时间(第四个参数)已到  
  39. //满足即可) ③指定的消息(第五个参数)已抵达线程的输入队列  
  40. //  
  41. //参数:  nCount=1                      指定列表中的句柄数量为1  
  42. //       pHandles=Event                指定对象句柄组合中的第一个元素为Event  
  43. //       fWaitAll=False                任何对象发出信号即可  
  44. //       dwMilliseconds=dwMilliseconds 等待的毫秒数为延时时间  
  45. //       dwWakeMask=QS_ALLINPUT        标识特定的消息类型为消息队列的任何消息  
  46. //返回值:WAIT_OBJECT_0 1(nCount)      有指定类型的消息到达  
  47. //*************************************************************************  

 

以下是MSDN中关于MsgWaitForMultipleObjects的一段说明:

 

The MsgWaitForMultipleObjects function determines whether the wait criteria have been met. If the criteria have not been met, the calling thread enters an efficient wait state, using very little processor time while waiting for the conditions of the wait criteria to be met.

本文由3522.com发布于计算机教程,转载请注明出处:改进的延时函数Delay(使用MsgWaitForMultipleObjects等

关键词: 3522.com

上一篇:洛谷P1720 月落乌啼算钱,p1720

下一篇:没有了