Ian Branch 135 Posted May 10, 2023 Hi Team, I have ths construct: var GeneralThread := TThread.CreateAnonymousThread(procedure begin // tqServerSessions.Close; // try if TEDBEngineSessionManager(DBSWhoIsOn.Handle).TryLock(1) then begin TEDBEngineSessionManager(DBSWhoIsOn.Handle).Unlock; { Session is not locked and is safe for you to use } tqServerSessions.ExecSQL; end else // Delay for the specified amount of time TThread.Sleep(500); // except ... ... end; // tqServerSessions.Last; // ... ... end); How do I safely loop the Try-Else for x times, and then break out after x times? Share this post Link to post
Remy Lebeau 1554 Posted May 10, 2023 On 5/10/2023 at 2:40 AM, Ian Branch said: I have ths construct: ... How do I safely loop the Try-Else for x times, and then break out after x times? Seriously? Can't you just use a standard For loop? I don't understand the issue. Share this post Link to post
programmerdelphi2k 238 Posted May 10, 2023 (edited) @Ian Branch maybe some like this: code attached... procedure TMyThread.Execute; var LWaitRestult: TWaitResult; begin // inherited; // FTicks64 := GetTickCount64; // while not Terminated do begin LogMe(Self.ThreadID.ToString + ', ...Thread is running ... 1 : Delay: ' + FDelay.ToString); // LWaitRestult := FEvent.WaitFor(FDelay); FMyEventWaitResult := LWaitRestult; // if (LWaitRestult = TWaitResult.wrTimeout) then begin LogMe(Self.ThreadID.ToString + ', hello timer: ' + FDelay.ToString + ', WaitResult: ' + LWaitRestult.ToString); // FTicks64 := (GetTickCount64 - FTicks64); // break; end; // LogMe(Self.ThreadID.ToString + ', ...Thread is running ... 2 : Delay: ' + FDelay.ToString); end; // if (LWaitRestult <> TWaitResult.wrTimeout) then begin FTicks64 := (GetTickCount64 - FTicks64); FMyEventWaitResult := LWaitRestult; end; end; code.txt Edited May 11, 2023 by programmerdelphi2k Share this post Link to post
Ian Branch 135 Posted May 10, 2023 Hi Remy, Yes, seriously. I don't really understand what goes on in Threads and therefore what you can and can't do. I am still learning about them. p2k, Tks. I will have a look. Tks to both of you. Regards, Ian Share this post Link to post
programmerdelphi2k 238 Posted May 10, 2023 (edited) maybe a little fix to get FTicks64 when the end the Thread.... procedure TMyThread.Execute; ... // while not Terminated do ... end; // if (LWaitRestult <> TWaitResult.wrTimeout) then // wrSignaled, etc... FTicks64 := GetTickCount64 - FTicks64; end; Edited May 10, 2023 by programmerdelphi2k Share this post Link to post
Lars Fosdal 1845 Posted May 11, 2023 WaitForMultipleObjects or WaitForSingleObject or the ..Ex versions allows waiting with a minimum of looping, i.e. less CPU usage. Examples of usage can be found f.x. in OmniThreadLibrary. Share this post Link to post
Dalija Prasnikar 1481 Posted May 11, 2023 On 5/10/2023 at 8:31 PM, Ian Branch said: I don't really understand what goes on in Threads and therefore what you can and can't do. If you need to loop some code x times and break out on some condition, then the simplest logic would be: for i := 0 to x do begin if TEDBEngineSessionManager(DBSWhoIsOn.Handle).TryLock(1) then begin ... // if succesfull break out of the loop Break; end else TThread.Sleep(500); end; Share this post Link to post
Vandrovnik 217 Posted May 11, 2023 On 5/11/2023 at 3:09 PM, Dalija Prasnikar said: If you need to loop some code x times and break out on some condition, then the simplest logic would be: for i := 0 to x do begin if TEDBEngineSessionManager(DBSWhoIsOn.Handle).TryLock(1) then begin ... // if succesfull break out of the loop Break; end else TThread.Sleep(500); end; That will loop the code (x+1) times 🙂 1 Share this post Link to post
Dalija Prasnikar 1481 Posted May 11, 2023 On 5/11/2023 at 4:16 PM, Vandrovnik said: That will loop the code (x+1) times 🙂 Counting is hard 1 Share this post Link to post