[DUG] Critical Section with Timeout
Ross Levis
ross at stationplaylist.com
Thu Nov 25 22:41:35 NZDT 2010
A mutex sounds more efficient than the loop with a sleep. But I assume I
will still need to handle multiple entries for the same thread, which is
allowed, but stop entries from other threads if in use. I'll try to modify
the existing procedure to use a mutex instead.
Ross.
From: delphi-bounces at delphi.org.nz [mailto:delphi-bounces at delphi.org.nz] On
Behalf Of Jolyon Smith
Sent: Thursday, 25 November 2010 7:21 AM
To: 'NZ Borland Developers Group - Delphi List'
Subject: Re: [DUG] Critical Section with Timeout
Why go to all this trouble?
If you need a critical section with the ability to time-out, just use a
mutex and WaitFor(TIMEOUT) instead!
From: delphi-bounces at delphi.org.nz [mailto:delphi-bounces at delphi.org.nz] On
Behalf Of Ross Levis
Sent: Thursday, 25 November 2010 1:52 a.m.
To: 'NZ Borland Developers Group - Delphi List'
Subject: [DUG] Critical Section with Timeout
I think I've come up with a solution to provide a critical section with a
timeout, and want some feedback, particularly if you can see any problems
with it.
Firstly 2 procedures which are used to enter and leave a section.
var
CS: TRTLCriticalSection;
LockThreadID: Cardinal;
function EnterProc: Boolean;
const
Timeout = 2000; // 2 seconds
var
ThreadID: Cardinal;
Start: Cardinal;
Elapsed: Integer;
OK: Boolean;
begin
EnterCriticalSection(CS);
ThreadID := GetCurrentThreadID;
if ThreadID = LockThreadID then
begin
Result := False;
LeaveCriticalSection(CS);
Exit;
end;
OK := True;
Start := GetTickCount;
while (LockThreadID <> 0) and OK do
begin
Sleep(1);
Elapsed := GetTickCount-Start;
OK := (Elapsed >= 0) and (Elapsed < Timeout);
end;
LockThreadID := ThreadID;
Result := True;
LeaveCriticalSection(CS);
end;
procedure LeaveProc;
begin
LockThreadID := 0;
end;
Note that I don't need speed where these procedures will be used, so the
Sleep(1) delay isn't an issue.
Now to use it.
var Locked: Boolean;
begin
Locked := EnterProc;
try
DoSomething;
finally
If Locked then LeaveProc;
end;
end;
It appears to work.
Ross.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://listserver.123.net.nz/pipermail/delphi/attachments/20101125/d645e6e8/attachment.html
More information about the Delphi
mailing list