[Lazarus] Lazarus Release 1.8
Luca Olivetti
luca at wetron.es
Mon Dec 11 16:33:49 CET 2017
El 11/12/17 a les 16:14, Michael Van Canneyt ha escrit:
>
>
> On Mon, 11 Dec 2017, Luca Olivetti wrote:
>
>> El 11/12/17 a les 13:43, Michael Van Canneyt ha escrit:
>>
>>>>
>>>> [*] I don't know if freeing a thread in OnTerminate is allowed. FPC
>>>> documentation here
>>>> https://www.freepascal.org/docs-html/rtl/classes/tthread.onterminate.html
>>>> says nothing about it, but
>>>> the example here (mentioned in the bug report)
>>>> http://docwiki.embarcadero.com/CodeExamples/Tokyo/en/TThreadYield_(Delphi)
>>>> seems to imply that it should.
>>>
>>> It is definitely not allowed in FPC, and I will document it as such.
>>
>> Ouch, that's not delphi compatible then (unless the example is flawed).
>> In any case it's better to be not compatible and clearly documented
>> than vaguely documented and maybe (just maybe) compatible (i.e. I
>> don't really care about delphi compatibility since I don't use it, but
>> sometimes you have to rely on delphi examples/documentation).
>
> The following is clearly nonsense:
>
> FThread.FreeOnTerminate := False; // Free FThread in the OnTerminate
> proc. This will set Terminated to true
>
> Terminated is already True in OnTerminate.
>
> So I think the example is flawed.
>
> From the TThread implementation:
>
> if (FThreadID = GetCurrentThreadID) then
> begin
> if not(FFreeOnTerminate) and not FFinished then
> raise EThreadDestroyCalled.Create('A thread cannot destroy
> itself except by setting FreeOnTerminate and leaving!');
>
> I think we cannot be more clear than that :)
Not really: OnTerminate is called in the context of the main thread, so
FThreadId is different than GetCurrentThreadId.
Bye
--
Luca Olivetti
Wetron Automation Technology http://www.wetron.es/
Tel. +34 93 5883004 (Ext.3010) Fax +34 93 5883007
More information about the Lazarus
mailing list