DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: forget66
今日帖子: 67
在线用户: 14
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
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的原因?
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2020/12/1 11:21:49
1楼: 我觉得可能系统原因会多了一点把
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 wr960204 (武稀松) ★☆☆☆☆ -
盒子活跃会员
2020/12/1 11:30:10
2楼: 这个时间长不长不一定,跟当时收到的消息多少和内容有关系,和消息处理的速度有关系。
ProcessMessages是把消息队列的消息都处理完,才返回。当时消息队列里面有多少消息,消息类型,某个消息的处理速度都不一定。
----------------------------------------------
武稀松http://www.raysoftware.cn
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2020/12/1 13:29:14
3楼: Sleep(1)并不是精确的1毫秒。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 nevergrief (孤独骑士) ★☆☆☆☆ -
盒子活跃会员
2020/12/1 16:00:38
4楼: 肯定是操作系统的原因啊,或者说,是这个操作系统里别的软件也在工作(你自己都未必知道),影响了这台WIN7的正常工作。不信的话,你把WIN7重装一下,然后直接俄运行这个EXE,看看效果就知道了。

其实也不用这么麻烦,把这个exe拷贝到任何一台别的机子上,不管是什么配置,都不可能是5秒这么久。
----------------------------------------------
只有偏执狂才能生存!
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/12/1 16:41:04
5楼: Sleep(1) 并不是精确的 1 毫秒。

如果是精确的,WINDOWS 就可以叫【实时】操作系统了。

至少 WINDOWS 和 LINUX 都不能叫【实时】操作系统。在需要精确定时执行或者完成任务的领域,需要其它的操作系统。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
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())+":结束");
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2020/12/2 17:12:29
8楼: 我在多个版本的Windows和Delphi下测试过,Sleep(1)执行时间大约15~16毫秒,而Application.ProcessMessages()正常情况下花费的时间极短,可以忽略不计。楼主你可以将Application.ProcessMessages()注释掉再测试。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 bamboocaep (bamboocaep) ★☆☆☆☆ -
普通会员
2020/12/2 21:06:39
9楼: sleep的精度跟下面这两个函数有关:
timeBeginPeriod
timeEndPeriod

调用timeBeginPeriod(1)之后,Sleep(1)大致是2毫秒
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2020/12/3 9:57:42
10楼: 谁没事会用sleep来计时,所以正常点的码农都不会在意它的精度

timeBeginPeriod这种东西会拖累整个系统的性能,这种API随时被微软限制要求拥有最高权限才能调用,而且, Windows就是Windows, 即使调用了这个计时精度一样不保证靠谱。

正常码农根本不会考虑用这种歪门邪道来计时。
----------------------------------------------
-
作者:
男 iamdream (银河恒久远,梦想无止境!) ★☆☆☆☆ -
大贡献会员
2020/12/3 12:17:10
11楼: 要计时哪怕用GetTickCount都行,更准确一点可以用QueryPerformanceCounter。
----------------------------------------------
-广袤璀璨的银河,永无止境的梦想(梦无止境游银河) 博客挂了……
作者:
男 feiyanm (feiyanm) ▲▲▲▲▲ -
普通会员
2020/12/3 13:34:22
12楼: QueryPerformanceCounter的精度大约能到20微秒左右,再小的话,好像意义不大了。
内存的寻址大概在50ns左右。
----------------------------------------------
Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!Delphi威武!千秋万代,一统江湖!我去WC吐一会儿去!
作者:
男 akuan54 (SKL) ★☆☆☆☆ -
普通会员
2020/12/3 14:27:01
13楼: 如果需要高精度,可以试试 Winapi.MMSystem.timeGetTime
----------------------------------------------
-
作者:
男 ken0137 (顺眼即佛) ★☆☆☆☆ -
普通会员
2020/12/5 15:02:23
14楼: 谢谢楼上各位,只是我当时这样写并不是用来计时的,只是想让程序等待0.5秒的样子然后再处理后面的数据,没想到的是在部署到其他win7(程序编写和测试是在win10)的电脑上时让整个过程增加了5-8秒的运行时间,当时还一下子没找到原因,
----------------------------------------------
只会简单使用,并未精通深入
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2020/12/5 15:47:23
15楼: 你直接 sleep(500)

比循环500次,每次 Sleep(1)

结果更精确,也更少占用 CPU 时间。

不过,只要不是实时操作系统,结果也精确不到哪里去。
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
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);
----------------------------------------------
-
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2020/12/6 7:55:05
0楼: 16楼是正规操作,你想延迟后再处理一些事情,最好是放进线程中执行,完了将结果返回自己再处理。
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 tjwhf (tjwhf) ▲▲▲▲△ -
普通会员
2020/12/6 9:44:26
17楼: 用TTimer阿
----------------------------------------------
-
作者:
男 keymark (嬲) ▲▲▲△△ -
普通会员
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/
作者:
男 shuaialang (lenog) ★☆☆☆☆ -
普通会员
2020/12/7 13:28:55
19楼: 加sleep是方便后期优化好向客户收钱吗
----------------------------------------------
-
作者:
男 johnyale (JohnYale) ★☆☆☆☆ -
普通会员
2020/12/9 1:48:40
20楼: 11楼说的 用GetTickCount
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行70.3125毫秒 RSS