2010-09-02 47 views
1

我正在嘗試在我的應用程序中進行漫長操作期間顯示一個指示疊加(點的旋轉圓圈)的活動。爲此,我創建了一個帶有TImage和Imagelist的無邊框透明窗體,我在主線程忙時嘗試在線程中進行更新。TThread.Execute未按預期方式調用

我遇到的問題是,冗長的操作似乎沒有得到我的線程'interupted'。 thread.Execute函數在冗長的操作開始之前循環幾次,然後在操作完成時再次循環。

看起來好像該線程由於某種原因而餓死。我試圖提高它的優先級,但看不到任何效果。

有沒有人有類似的經驗分享,甚至可能是一個解決方案?線程函數的


源代碼

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; 

回答

3

你正在做大量的工作線程的同步(),裏面這代表了回到主線程。如果主線程的冗長操作不處理來自消息隊列的新消息,則Synchronize()必須等待。這就是爲什麼你的線程在冗長的操作運行時不會做任何事情。

你的代碼是如何有效地使用線程的一個不好的例子。什麼,你應該做的,而不是在線程中執行冗長的操作本身,並讓同時線程運行時,主線程處理用戶界面更新,如:

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; 
+0

謝謝你的解釋。 – sum1stolemyname 2010-09-03 07:05:33

2

我用GIF圖像組件,可以顯示動畫GIF (http://www.tolderlund.eu/delphi/), 和我把一個冗長的操作在一個定時器(其中 在單獨的線程中執行)。

簡單但有效。

+0

這就是我首先想到的,但我不能在我的項目中使用第三方組件(因爲政治) – sum1stolemyname 2010-09-09 08:35:56