我主线程有一个循环,子线程要是计算主线程循环的时间,子线程的Execute方法中是发送一个消息给主线程,让它显示执行的时间值.
现在是主线程完全占用了CPU时间,已经加入了Sleep了,但接受时间值消息的方法还是无法被执行,请教达人解答下啊,小弟在线等!!!!

解决方案 »

  1.   

    最好不要用sleep,会引起主线程阻塞,相当于什么事也不做,当然也不会取消息。
    主线程里适当的地方加一些Application.ProcessMessage好了
      

  2.   

    Application.ProcessMessage我试过了,循环中的处理长的话,不能真实反映时间值,我现在的做法是建立两条线程,一条计算时间,把主线程要循环的放在另一条中执行,现在倒是可以了.
      

  3.   

    这个线程的FreeOnTerminate设成什么?默认是true,在Thread.Terminate的时候,里面创建的对象也都free掉了。
      

  4.   

    你们帮我看看哈,我都没办法了. ^_^
    是不是我在释放的时候把"Form"这个也释放掉了呀?
    这样定义的:
      TProcessThread = class(TThread)
      protected
        procedure Execute;override;
      public
        Form:TFrmMain;
        constructor Create(F:TFrmMain);
      end;constructor TProcessThread.Create(F:TFrmMain);
    begin
      Form := F;
      inherited Create(False);
    end;procedure TProcessThread.Execute;
    begin
      inherited;
      with Form do
      begin
        DoUpload;
      end;
    end;
      

  5.   

    哎,终于好了,主要是在DoUpLoad方法里有一个Panel的Visible属性的设置,启动时显示Panel,完成后隐藏,我把这段代码去掉就好了,但不知道是为什么?能帮我解释下吗?
      

  6.   

    在多线程里面不能直接操作VCL(界面主线程),否则会因为代码没有同步造成应用程序异常。
    一般把VCL操作代码放到一个过程里面,然后在线程里面使用Synchronize同步到主线程。P.S. 一般多线程不直接引用或操作VCL类,可以考虑通过事件的方式委托出去。
      

  7.   

    把针对窗体的操作放到Synchronize过程中执行