[fpc-devel] Suspicion about TThread.Synchronize
Martin
fpc at mfriebe.de
Mon Feb 5 03:03:19 CET 2018
Ok, I got it again in the debugger.
Since it is nor reproducible all the times, I am using auto continue
breakpoints, and just record that they were hit. So I have limited data.
- After a long series of syncs ThreadQueueTail is nil.
- A thread calls ThreadQueueAppend (from within Syncronize)
- It then leaves it do execute
there was no CheckSyncronize in between the 2 last steps. the thread
should be waiting for the main thread to sync. but it does not.
I captured the SyncEvent of the queue entries. (as seen in
checkSyncronize). And there something strange goes on.
The queue entries from 2 threads have the same SyncEvent
Maybe this is actually an issue in the application code.
The below is a method on a TTHread. This method is called before the
thread is started, it does actually start it (last line)
procedure TThreadDownload.DownloadJSON(const ATimeOut: Integer = -1;
const ASilent: Boolean = False);
begin
FRemoteJSONFile :=
Options.RemoteRepository[Options.ActiveRepositoryIndex] + cRemoteJSONFile;
FDownloadType := dtJSON;
FSilent := ASilent;
FTimer := TThreadTimer.Create;
FTimer.Interval := ATimeOut;
FTimer.OnTimer := @DoOnTimer;
FTimer.StartTimer;
Start;
end;
So when the ThreadTimer goes off, it calls DoOnTimer. But on the
TThreadDownload object
And in DoOnTimer makes a call to Syncronize. (but DoOnTimer is a method
of TThreadDownload)
Am I right, and it then uses the ID of the TThreadDownload? Even so it
is running in the thread of the ThreadTimer?
So if TThreadDownload schedules its own Synchronize, before the event of
ThreadTimer is processed, the TThreadDownload will falsely think, that
it's event was processed when in reality it was the event of the timer.
Also then probably the event in FSynchronizeEntry is used twice in
parallel, which it is not designed for?
More information about the fpc-devel
mailing list