[Lazarus] custom thread reading file does not respond properly
el.es.cr at gmail.com
Wed Sep 6 16:26:32 CEST 2017
On 06/09/17 10:31, Andrea Mauri via Lazarus wrote:
> Il 05/09/2017 22:51, Sven Barth via Lazarus ha scritto:
>> It is however solved if you add a "Yield;" after the Synchronize
>> call. So my suspicion is that the scheduling of Mac OS X is somehow
>> messing things up. Either the scheduling is favoring the one thread
>> while it shouldn't (though even reducing the priority doesn't help)
>> or the UI framework of Mac OS X (and whatever else is involved in
>> the main thread) is so heavy weight that the timeslice of the
>> mainthread is used up more often than not thus leading to the read
>> thread being scheduled much more often. By using Yield (or also
>> Sleep(), but Yield is without any pause) the thread is explicitly
>> giving up its timeslice and that seems to be enough here...
> I changed the code following your hints and I added Yield. This is
> not enough, it seems that the application is a little bit more
> responding (I can click on Tedit and after seconds the text is
> highlighted) but not enough to be usable. Actually for me it works
> only if I add at least Sleep(1). It is a pity that there is not a
> unique solution.
Can you try ThreadSwitch after Sleep ?
while (not Terminated) do
if eof(f) then
if NewStatus <> fStatusText then
fStatusText := newStatus;
ThreadSwitch; /// <<<<
else // also you need to cover what happens in ANY OTHER outcome of any test, e.g.
// because if NewStatus = fStatusText, you will IMMEDIATELY jump to the first instruction of the thread
// so adding the ThreadSwitch at the very end of the loop, you give the rest of the application (the main thread) a chance to
// actually do anything
Thread.Execute will execute ALL THE TIME if you don't yield/threadswitch in some code path, and WILL saturate your CPU.
More information about the Lazarus