,我們可以調用同一個線程在幾個時間MyThread.waitfor。如果線程已經終止沒有問題,這將不會引發任何異常並立即返回(正常行爲)。這是Android下TThread的bug嗎?在Windows
在Android上,這是不同的,如果我們調用兩次MyThread.waitfor那麼我們將有第二次嘗試用「沒有這樣的過程」異常。
function TThread.WaitFor: LongWord;
{$ELSEIF Defined(POSIX)}
var
X: Pointer;
ID: pthread_t;
begin
if FExternalThread then
raise EThread.CreateRes(@SThreadExternalWait);
ID := pthread_t(FThreadID);
if CurrentThread.ThreadID = MainThreadID then
while not FFinished do
CheckSynchronize(1000);
FThreadID := 0;
X := @Result;
CheckThreadError(pthread_join(ID, X));
end;
{$ENDIF POSIX}
錯誤是由因爲調用WAITFOR他們設置FThreadID:= 0,關閉過程的任何進一步的通話將failled
我覺得這是必須這樣寫:
function TThread.WaitFor: LongWord;
{$ELSEIF Defined(POSIX)}
begin
if FThreadID = 0 then exit;
...
end;
{$ENDIF POSIX}
什麼你認爲 ?我需要在emb上打開一個bug請求嗎?
感謝大衛,但如果你看waitfor的實現,他們設置FThreadID:= 0,所以任何進一步調用waitfor可以檢查FThreadID = 0,如果是立即返回? – loki
他們可以這樣做,我想。但是他們不能有多個等待的線程。無論如何,你爲什麼要從同一個線程中等待兩次? –
它不是真的關於多線程,但多功能..例如,當你有幾個功能(這是所有從主線程調用),需要等待線程完成之前繼續(這些功能都是獨立的)。那麼所有的測試MyThread.waitfor。當然,我可以更新所有的功能,如果不是MyThread.checkTerminated然後MyThread.waitfor – loki