,我们可以调用同一个线程在几个时间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