2014-04-08 42 views
1

我第一次使用OTL,並試圖使用Async/Await抽象。爲什麼我用OTL得到這個錯誤?

現在,我創建了一個小程序來看看會發生什麼。這只是一個按鈕,它調用了這個過程。

procedure TForm2.Button1Click(Sender: TObject); 
var i : integer; 
begin 
Button1.enabled := false; //Only for second try 

for i := 0 to 100 do 
begin 

Async(
    procedure begin 
    sleep(5000); 
end). 
Await(
    procedure begin 

    //First Try - Button1.Enabled := true; 

    //Second Try - showmessage('finished') 

    end 
); 

Button1.enabled := true; //Only for the second try. 

    end; 
end; 

一次嘗試

爲此,它工作正常,在第一時間,禁用按鈕,睡眠對於異步操作,然後啓用它回來。

但第二次點擊按鈕時,它被禁用,但從未再次啓用。

第二次嘗試

這一次,我想表明的消息X100倍和它的作品第一次藏漢,但是當我再次調用過程我得到以下錯誤TOminCommunicationEndpoint.Send: Queue is full

可有人誰已經使用這個庫解釋給我,爲什麼我得到這個錯誤?如果它與第一次嘗試的問題有關?

+0

當您在調試器下運行此代碼時,會引發異常,它會告訴您此問題。你應該養成使用提供的工具的習慣。調試器很有用。 –

回答

2

看來你正在達到OTL的內部限制。

每次調用Async-Await都會啓動一個新線程並立即返回。循環完成後,最終會有100個線程,每個線程在執行等待代碼之前等待5秒鐘。

AFAIK,使用線程池時,OTL中有60個併發線程的限制。

+0

這不可能是真的。如果有N個隱藏的本地數據,每個循環迭代一個,那麼在編譯時就不會知道堆棧幀大小。必須有一個隱藏的本地。 –

+0

@DavidHeffernan,你是對的。因爲它似乎仍然是由於OTL的限制,我重新編寫了我的答案。 –

+1

60個線程的限制必須是可定製的。我的客戶擁有比這更多內核的機器。我想這是普里莫茲的問題。 –

相關問題