“抢先式”任务调度和时间片的问题(100分)

  • 主题发起人 主题发起人 savetime
  • 开始时间 开始时间
谁愿意回答我上面提问的 REALTIME 的问题。
 
关于你上面的问题,可以这么说,<br>是程序自己主动出让了CPU的控制权,<br><br>在实时的进程和线程的优先级下<br>(需要设置进程优先级类,和线程优先级,两个优先级都设置为实时级)<br>有几个操作会让出CPU的使用权,导致切换到其它进程<br>GetMessage (PeekMessage是不会的)<br>Sleep<br>其它的一切 同步或互斥的等待操作<br>以及IO操作<br>还有,SuspendThread <br><br>而你所使用的函数,PeekMessage 会让自身进程接收消息<br>TranslateMessage(Msg);<br>DispatchMessage(Msg);<br>两个函数却会让出CPU的控制权,
 
Application.ProcessMessages;<br>虽然不会造成完全死掉,但是它占用了大部分的CPU,<br>在不停的进行查询消息队列<br><br>如下面的代码,运行后,鼠标都动不了了<br>var<br>&nbsp; t, t1, t2: Integer;<br>&nbsp; Msg: TMsg;<br>begin<br>&nbsp; SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS);<br>&nbsp; SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL);<br>&nbsp; t1 := GetTickCount;<br>&nbsp; t := t1;<br><br>&nbsp; while GetTickCount - t1 &lt; 8000 do<br>&nbsp; begin<br>&nbsp; &nbsp; t := t + 1;<br>&nbsp; end;<br><br>&nbsp; SetPriorityClass(GetCurrentProcess, NORMAL_PRIORITY_CLASS);<br>&nbsp; SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_NORMAL);<br>&nbsp; ShowMessage('ok:' + IntToStr(t));<br><br>但是,如果你把循环中的代码改成,我前面所说的一些函数,<br>可能程序自己会没有反应,但别的进程就正常了
 
解释得很好,已经明白了。<br>刚才我在疑惑 Delphi Application 也在用 PeekMessage 处理消息循环,为什么<br>它不占用全部的 CPU 时间呢?<br>原来 Application.HandleMessage 还调用了 Idle 函数。<br>而 Idle 函数最后调用了 WaitMessage,估计是这个函数出让了 CPU 控制权。<br>与 GetMessage 有点类似:<br>Note that WaitMessage does not return if there is unread input in the message queue after the thread has called a function to check the queue. This is because functions such as PeekMessage, GetMessage, GetQueueStatus, WaitMessage, MsgWaitForMultipleObjects, and MsgWaitForMultipleObjectsEx check the queue and then change the state information for the queue so that the input is no longer considered new. A subsequent call to WaitMessage will not return until new input of the specified type arrives. The existing unread input (received prior to the last time the thread checked the queue) is ignored.<br><br>&gt;&gt; TranslateMessage(Msg);<br>&gt;&gt; DispatchMessage(Msg);<br>&gt;&gt; 两个函数却会让出CPU的控制权,<br>有点怀疑,有文档说明吗?因为这两个函数和消息队列的关系并不特别紧密。<br>
 
那也算核心??哈哈,你自己下载去编译成一个linux吧!Linux吹得那么牛、免费、开放源代码,还会被微软打得宣布退出桌面操作系统?哈哈!
 
&gt;&gt; 那也算核心??哈哈,你自己下载去编译成一个linux吧!<br>什么是核心,是不是微软最近漏出的源代码?<br>&gt;&gt; Linux吹得那么牛、免费、开放源代码,还会被微软打得宣布退出桌面操作系统?哈哈!<br>什么逻辑?简直不知所云。
 
不过这是一种一直让CPU处于忙状态的做法 而且,你只能在这个死循环中处理一些事情, <br>如果我要做另外的事情,比如说消息触发的问题,比如我要从网络(Socket)接收数据<br>而且是基于消息触发机制的,改怎么办?<br>
 
&gt;&gt; TranslateMessage(Msg);<br>&gt;&gt; DispatchMessage(Msg);<br>&gt;&gt; 两个函数却会让出CPU的控制权,<br>--有点怀疑,有文档说明吗?因为这两个函数和消息队列的关系并不特别紧密。<br><br>没有文档说明,只是根据运行时的现象来说的,<br>因为 Application.ProcessMessages;<br>只调用了三个API函数,<br>如果只调用,PeekMessage 别的程序会死,<br>但本程序可以接收消息<br>如果加上那两个函数,CPU占用几乎100%,<br>但其它的程序都是正常的<br><br>所以,肯定与那两个函数有关,只是我还没有做测试<br>谁有功夫,可以测试一下<br>&nbsp;<br>
 
不过也有可能和 SendMessage也有关系, 因为,它也被调用了
 
因为 Application.ProcessMessages; 只调用了三个API函数,<br>如果只调用,PeekMessage 别的程序会死, 但本程序可以接收消息<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;^^^^^^^^^^^^^^^^^^^^<br>本程序应该是收不到消息了,连鼠标都定下来了,WINDOWS 没有 CPU 时间再发消息。<br><br>但是如果把循环中的 ProcessMessages 改为 HandleMessage 就 OK 了。<br>二者的主要差别在于 HandleMessage 调用了 WaitMessage 。<br>我猜想这时 Windows 才获得了时间片,应用程序调度才会正常。
 
看来弄死Win2000也挺容易的呀
 
Advanced Windows 上说原本微软没想开放 REALTIME 优先级,<br>可能是由于市场需要而开放的吧。<br>什么时候开个贴讨论有几种方法可以把 Windows2000 搞死 :)
 
这个问题挺有意思,谢谢各位参与。
 
后退
顶部