我在用delphi写IOCP程序的时候,在工作者线程函数里面我是这么写的
function ServerWorkerThread(CompletionPortID:Pointer):Integer;stdcall;
begin     while(TRUE) do
       begin             GetQueuedCompletionStatus().............
             ........
             ....       end;end;这个时候运行程序导致程序占用掉所有的CPU,CPU使用率达到100%;
如果我在while(TRUE)循环体里面加个sleep(2),如下:while(TRUE) do
       begin             GetQueuedCompletionStatus().............
             ........
             ....
             sleep(2);
       end;则CPU就正常了;可是这样就是让工作者线程sleep一会儿,应当会影响到服务器的执行效率的。应当不是我的程序问题,我在写其他程序的时候,如果是用到线程,且里面有这种while(TRUE)的时候,总是要sleep(2),才不会导致CPU %。不知道为什么?
难道是delphi 7的问题??我看很多用VC写的IOCP的例子里面,都是直接while(TRUE),没有sleep的,他们的CPU都很正常啊。

解决方案 »

  1.   

    摘自MSDN:A thread can relinquish the remainder of its time slice by calling this function with a sleep time of zero milliseconds. 
      

  2.   

    sleep(0)不行啊,还是CPU 100%,sleep(2) CPU虽然没有100%,可是还是很高,sleep(100)的法CPU就很低了。
      

  3.   

    我感觉让线程sleep一会儿,不管这一会儿是多少,都会影像到服务器的执行效率的,
    如果不sleep,CPU就会100%。
      

  4.   

    执行效率并不是说一直做检查就是效率高.要知道在循环中大多数的检查都是没有值,空检查的。应该提高检查次数和有数据的比率才是正确的利用CUP资源。你的SLEEP时间太短的话,系统将很多时间都浪费在线程的切换上了。