环境是D7  
新建一个空程序就在线程里while true do
  inc(i);
就这样,CPU就50%了   而同样代码 VC则不会尝试过 加SLEEP(1)  有效果 但因为要捕包 所以不允许有任何 睡眠在线程 create时候 降低优先级   没任何效果请教高手了  谢谢

解决方案 »

  1.   

    根据你的情况自己写个message loop吧,不过感觉如果你对实时性要求那么高的话,最好用事件驱动机制而不是查询。
      

  2.   

    回2L的 我觉得不关代码问题 因为我直接 创建个新的空窗体 然后只有一个线程tmyThread := TmyThread.Create(True);
    tmyThread.Resmue;线程里只有while true do
     inc(i);就这样    CPU就50了哦   救命啊 大侠们
      

  3.   

    没有sleep或者消息循环,CPU占用高肯定的,如果你是单核的,恐怕要占用100%了。
      

  4.   

    while True do
    begin
      Inc(i);
      Application.HandleMessage;
    end;
      

  5.   

    如果你是多线程的程序,线程函数使用了循环(for、while等)就必须要加上Sleep(0),否则最先进入循环的子线程会抢占所有子线程时间片,其他子线程可能很长时间或者根本得不到时间片而无法正常执行,而且这和delphi无关,vc也是一样的,就像ls说的,最好使用事件驱动。
      

  6.   

    while True do
    begin
      Inc(i);
      Application.ProcessMessage;
    end;
      

  7.   

    Sleep(0)  请问这个  会 起到延迟效果吗?  0  哦
      

  8.   

    Sleep(0)告诉系统切换CPU时间片,就是把当时CPU时间片切换到其它线程去执行,也是会起到延迟效果。
      

  9.   

    会的,Sleep(0)函数表明该线程放弃下一次时间片,如果加个具体的数字如Sleep(100),表明在100ms内该线程都会放弃时间片,win32的线程时间片一般是20-25ms,所以100ms会放弃4或5次时间片让其他子线程执行,这不是太精确,理论是这样,实际会有一点偏差。
      

  10.   

    那请问楼下楼上的 假如线程里 while true do
    begin
      inc(i);
      sleep(0);
    end;这样可以有效降低CPU占用高么还有 我的捕包是用 winpcap 来 循环捕的,貌似自带没 事件 - -。。
      

  11.   

    不好意思,刚查了下书,记错了,是Sleep(1)表示放弃下一次时间片,Sleep(0)不知行不行。
      

  12.   

    sleep(0):
    Res
    A thread can relinquish the remainder of its time slice by calling this function with a sleep time of zero milliseconds. 
      

  13.   

    没有不允许任何睡眠的程序。
    如果不允许任何睡眠那你就应该同时不允许其他程序分到任何时间片,那就死机了。
    肯定需要sleep的。
      

  14.   

    这是我的解决方法,我的软件和你差不多,也需要类似定时抓包的功能,const
      CThreadPauseTime = 10;
    ...
    procedure TLeonSuRockeyThread.Execute;
    begin
      while (not Terminated) do
      begin
        if FPaused then
        begin
          Sleep(CThreadPauseTime * 1000);
        end;
        FTime := (GetTickCount - FStartTime) div 1000;
        if FTime >= CThreadPauseTime then
        begin
          FStartTime := GetTickCount;
          Synchronize(DoOnTime);
        end;
        if (not Terminated) then
          Sleep(CThreadPauseTime * 1000);
      end;
    end;
    ...结论就是用Slepp能达到我满意的效果(CPU占用 0%),但有一定的小技巧。