导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2020/11/30 15:21:53
标题:
Application.ProcessMessages会运行很长时间吗?
浏览:1726
加入我的收藏
楼主:
代码: LogTxt.Lines.Add(TimeToStr(Now)+':开始'); for i:=0 to 500 do begin Application.ProcessMessages; Sleep(1); end; LogTxt.Lines.Add(TimeToStr(Now)+':结束'); 在一台,i3-4160 3.6Ghz,win7的电脑上显示需要5秒,或者更久比如8秒 在一台,i7-7700 3.6Ghz,win10的电脑上显示需要1秒,或者可能1秒不到 请问这是操作系统原因还是cpu的原因?
----------------------------------------------
只会简单使用,并未精通深入
作者:
2020/12/1 11:21:49
1楼:
我觉得可能系统原因会多了一点把
----------------------------------------------
只会简单使用,并未精通深入
作者:
2020/12/1 11:30:10
2楼:
这个时间长不长不一定,跟当时收到的消息多少和内容有关系,和消息处理的速度有关系。 ProcessMessages是把消息队列的消息都处理完,才返回。当时消息队列里面有多少消息,消息类型,某个消息的处理速度都不一定。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
2020/12/1 13:29:14
3楼:
Sleep(1)并不是精确的1毫秒。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2020/12/1 16:00:38
4楼:
肯定是操作系统的原因啊,或者说,是这个操作系统里别的软件也在工作(你自己都未必知道),影响了这台WIN7的正常工作。不信的话,你把WIN7重装一下,然后直接俄运行这个EXE,看看效果就知道了。 其实也不用这么麻烦,把这个exe拷贝到任何一台别的机子上,不管是什么配置,都不可能是5秒这么久。
----------------------------------------------
只有偏执狂才能生存!
作者:
2020/12/1 16:41:04
5楼:
Sleep(1) 并不是精确的 1 毫秒。 如果是精确的,WINDOWS 就可以叫【实时】操作系统了。 至少 WINDOWS 和 LINUX 都不能叫【实时】操作系统。在需要精确定时执行或者完成任务的领域,需要其它的操作系统。
----------------------------------------------
-
作者:
2020/12/2 7:58:19
6楼:
具体到这么细节的研究估计还真没人搞过 毕竟楼主的这种代码还没人这么写过
----------------------------------------------
-
作者:
axel (axel)
★☆☆☆☆
-
普通会员
2020/12/2 11:11:43
7楼:
BCB6 WIN7-64BIT I5-3210 测试了一下,Sleep还是比较准的,500不到1秒,改到5000是5秒 Memo1->Lines->Add(TimeToStr(Time())+":开始"); for(int i=0;i<5000;i++) { Application->ProcessMessages(); Sleep(1); } Memo1->Lines->Add(TimeToStr(Time())+":结束");
----------------------------------------------
-
作者:
2020/12/2 17:12:29
8楼:
我在多个版本的Windows和Delphi下测试过,Sleep(1)执行时间大约15~16毫秒,而Application.ProcessMessages()正常情况下花费的时间极短,可以忽略不计。楼主你可以将Application.ProcessMessages()注释掉再测试。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2020/12/2 21:06:39
9楼:
sleep的精度跟下面这两个函数有关: timeBeginPeriod timeEndPeriod 调用timeBeginPeriod(1)之后,Sleep(1)大致是2毫秒
----------------------------------------------
-
作者:
2020/12/3 9:57:42
10楼:
谁没事会用sleep来计时,所以正常点的码农都不会在意它的精度 timeBeginPeriod这种东西会拖累整个系统的性能,这种API随时被微软限制要求拥有最高权限才能调用,而且, Windows就是Windows, 即使调用了这个计时精度一样不保证靠谱。 正常码农根本不会考虑用这种歪门邪道来计时。
----------------------------------------------
-
作者:
2020/12/3 12:17:10
11楼:
要计时哪怕用GetTickCount都行,更准确一点可以用QueryPerformanceCounter。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
2020/12/3 13:34:22
12楼:
QueryPerformanceCounter的精度大约能到20微秒左右,再小的话,好像意义不大了。 内存的寻址大概在50ns左右。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
2020/12/3 14:27:01
13楼:
如果需要高精度,可以试试 Winapi.MMSystem.timeGetTime
----------------------------------------------
-
作者:
2020/12/5 15:02:23
14楼:
谢谢楼上各位,只是我当时这样写并不是用来计时的,只是想让程序等待0.5秒的样子然后再处理后面的数据,没想到的是在部署到其他win7(程序编写和测试是在win10)的电脑上时让整个过程增加了5-8秒的运行时间,当时还一下子没找到原因,
----------------------------------------------
只会简单使用,并未精通深入
作者:
2020/12/5 15:47:23
15楼:
你直接 sleep(500) 比循环500次,每次 Sleep(1) 结果更精确,也更少占用 CPU 时间。 不过,只要不是实时操作系统,结果也精确不到哪里去。
----------------------------------------------
-
作者:
2020/12/5 15:51:09
16楼:
你的想法,更优雅的实现是: uses System.Threading; TTask.Run(procedure begin sleep(500); TThread.Synchronize(TThread.Current,procedure begin //Do Your Job Here; end); end);
----------------------------------------------
-
作者:
2020/12/6 7:55:05
0楼:
16楼是正规操作,你想延迟后再处理一些事情,最好是放进线程中执行,完了将结果返回自己再处理。
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
tjwhf (tjwhf)
▲▲▲▲△
-
普通会员
2020/12/6 9:44:26
17楼:
用TTimer阿
----------------------------------------------
-
作者:
2020/12/6 23:57:13
18楼:
忘记群里谁说过Sleep(X) 如果cpu占用很高 系统调度 大概会大于(X) 我没测试过 ,也许记错.
----------------------------------------------
[alias] co = clone --recurse-submodules up = submodule update --init --recursiveupd = pullinfo = statusrest = reset --hard懒鬼提速https://www.cctry.com/ >http://qalculate.github.io/downloads.htmlhttps://www.cctry.com/
作者:
2020/12/7 13:28:55
19楼:
加sleep是方便后期优化好向客户收钱吗
----------------------------------------------
-
作者:
2020/12/9 1:48:40
20楼:
11楼说的 用GetTickCount
----------------------------------------------
-