我有一个线程的Execute里是这样写的    while not self.Terminated do
    begin
       main;//线程里的一个函数
       application.ProcessMessages ;
       sleep(600000);
    end;
我是想每隔600000ms执行一次main函数
程序运行一段时间后没反应了,没捕捉到原因,像是线程终止了,之后程序一直占25%的CPU
不知道是不是跟这里的设置有关,我能不能这样写
或者程序有可能的哪里出了问题,请各位指引一下

解决方案 »

  1.   

    application.ProcessMessages ; //这句去掉
      

  2.   

    其它的,无法看出问题,要看 main 的代码
      

  3.   

    application.ProcessMessages 去掉它;你的线程被sleep阻塞了,没关系。
      

  4.   

    while not self.Terminated do
        begin
           main;//线程里的一个函数
           application.ProcessMessages ;
           sleep(600000);
        end;
    绝对不能这么写,你的线程一睡就睡上600秒,你关闭主程序时还要等这个线程执行完,你要等到什么时候:
    while not Terminated do
    var
      i: Integer;
    begin
      main;//这个方法有没有关于主线程的东西,比如操作VCL
      for i := 1 to 6000 do
        if  Terminated then
          Exit
        else
          Sleep(100);
    end;
      

  5.   

    对于楼上所说的这个问题,我一般采用WaitForSingleObject这个API函数代替Thread对象中Terminated,同时修改它的Terminate方法。
      

  6.   

    其他WaitFor...Object在TThread的Destroy中已经用上了,而且用得更加成熟。
    WaitForSingleObject并不能代替Terminated,而Terminate也只是将Terminated属性置为Ture。
      

  7.   

    我除非是偷懒,一般都会使用WaitForSingleObject替代Terminated,同时也会修改Terminate函数,使它发送一个事件。