代码之家  ›  专栏  ›  技术社区  ›  sum1stolemyname

执行未按预期调用

  •  1
  • sum1stolemyname  · 技术社区  · 14 年前

    我遇到的问题是,冗长的操作似乎没有被我的线程“打断”。这个线程。执行函数在冗长的操作开始之前循环几次,然后在操作完成时再次循环。

    有没有人有类似的经验可以分享,或者甚至是一个解决方案?


    线程函数源代码

    procedure TIndicatorThread.Execute;
    begin
      inherited;
      while(not Terminated) do
        begin
          fDlg.fCurindex := (fDlg.fCurindex+1) mod 12;
          Synchronize(UpdateImage);
          Application.ProcessMessages;
          sleep(80);
        end;
        Synchronize(fDlg.close);
        Synchronize(fDlg.Free);
    end;
    

    主螺纹

    begin
    [...]
    myThread := TIndicatorThread.Create;
    mythread.Resume;
    
    Init_SomeUIRelatedstuff;
    Application.ProcessMessages;
    
    DoLengthyOperation; 
    
    mythread.Terminate;
    
    2 回复  |  直到 14 年前
        1
  •  3
  •   Remy Lebeau    14 年前

    您正在Synchronize()中执行大部分线程工作,Synchronize()将工作委派回主线程。如果主线程的冗长操作没有处理来自消息队列的新消息,则Synchronize()必须等待。这就是为什么在长时间的操作运行时,线程不执行任何操作的原因。

    您的代码是如何有效使用线程的一个糟糕示例。相反,您应该在线程中执行冗长的操作本身,并让主线程在线程运行时处理UI更新,例如:

    procedure TWorkThread.Execute; 
    begin 
      DoLengthyOperation;  
    end; 
    
    begin 
      ...
      Init_SomeUIRelatedstuff; 
      Application.ProcessMessages; 
    
      myThread := TWorkThread.Create(False);
      while WaitForSingleObject(myThread.Handle, 80) = WAIT_TIMEOUT do
      begin 
        fDlg.fCurindex := (fDlg.fCurindex+1) mod 12; 
        UpdateImage; 
        Application.ProcessMessages; 
      end; 
      mythread.Free;
    
      fDlg.Close; 
      fDlg.Free;
    
      ...
    end;
    
        2
  •  2
  •   Ljubomir Đokić    14 年前

    我使用GIF图像组件,可以显示动画GIF( http://www.tolderlund.eu/delphi/ ), 我把一个长时间的操作放在一个计时器里 在单独的线程中执行)。

    简单但有效。