<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:p="urn:schemas-microsoft-com:office:powerpoint" xmlns:a="urn:schemas-microsoft-com:office:access" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns:b="urn:schemas-microsoft-com:office:publisher" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-microsoft-com:office:component:spreadsheet" xmlns:odc="urn:schemas-microsoft-com:office:odc" xmlns:oa="urn:schemas-microsoft-com:office:activation" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:q="http://schemas.xmlsoap.org/soap/envelope/" xmlns:rtc="http://microsoft.com/officenet/conferencing" xmlns:D="DAV:" xmlns:Repl="http://schemas.microsoft.com/repl/" xmlns:mt="http://schemas.microsoft.com/sharepoint/soap/meetings/" xmlns:x2="http://schemas.microsoft.com/office/excel/2003/xml" xmlns:ppda="http://www.passport.com/NameSpace.xsd" xmlns:ois="http://schemas.microsoft.com/sharepoint/soap/ois/" xmlns:dir="http://schemas.microsoft.com/sharepoint/soap/directory/" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dsp="http://schemas.microsoft.com/sharepoint/dsp" xmlns:udc="http://schemas.microsoft.com/data/udc" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sub="http://schemas.microsoft.com/sharepoint/soap/2002/1/alerts/" xmlns:ec="http://www.w3.org/2001/04/xmlenc#" xmlns:sp="http://schemas.microsoft.com/sharepoint/" xmlns:sps="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:udcs="http://schemas.microsoft.com/data/udc/soap" xmlns:udcxf="http://schemas.microsoft.com/data/udc/xmlfile" xmlns:udcp2p="http://schemas.microsoft.com/data/udc/parttopart" xmlns:wf="http://schemas.microsoft.com/sharepoint/soap/workflow/" xmlns:dsss="http://schemas.microsoft.com/office/2006/digsig-setup" xmlns:dssi="http://schemas.microsoft.com/office/2006/digsig" xmlns:mdssi="http://schemas.openxmlformats.org/package/2006/digital-signature" xmlns:mver="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns:mrels="http://schemas.openxmlformats.org/package/2006/relationships" xmlns:spwp="http://microsoft.com/sharepoint/webpartpages" xmlns:ex12t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:ex12m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:pptsl="http://schemas.microsoft.com/sharepoint/soap/SlideLibrary/" xmlns:spsl="http://microsoft.com/webservices/SharePointPortalServer/PublishedLinksService" xmlns:Z="urn:schemas-microsoft-com:" xmlns:st="" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv=Content-Type content="text/html; charset=us-ascii">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
/* Font Definitions */
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 3 0 0 0 0 0 0 0;}
@font-face
        {font-family:PMingLiU;
        panose-1:2 2 3 0 0 0 0 0 0 0;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
@font-face
        {font-family:"\@PMingLiU";
        panose-1:2 2 3 0 0 0 0 0 0 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri","sans-serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle18
        {mso-style-type:personal;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang=EN-NZ link=blue vlink=purple>
<div class=Section1>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'>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.<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'>Ross.<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'><o:p> </o:p></span></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>
<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> delphi-bounces@delphi.org.nz
[mailto:delphi-bounces@delphi.org.nz] <b>On Behalf Of </b>Jolyon Smith<br>
<b>Sent:</b> Thursday, 25 November 2010 7:21 AM<br>
<b>To:</b> 'NZ Borland Developers Group - Delphi List'<br>
<b>Subject:</b> Re: [DUG] Critical Section with Timeout<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><span style='color:#1F497D'>Why go to all this trouble?<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'>If you need a critical section
with the ability to time-out, just use a mutex and WaitFor(TIMEOUT) instead!<o:p></o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='color:#1F497D'><o:p> </o:p></span></p>
<div>
<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>
<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> delphi-bounces@delphi.org.nz
[mailto:delphi-bounces@delphi.org.nz] <b>On Behalf Of </b>Ross Levis<br>
<b>Sent:</b> Thursday, 25 November 2010 1:52 a.m.<br>
<b>To:</b> 'NZ Borland Developers Group - Delphi List'<br>
<b>Subject:</b> [DUG] Critical Section with Timeout<o:p></o:p></span></p>
</div>
</div>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'>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.<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'>Firstly 2 procedures
which are used to enter and leave a section.<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal>var<o:p></o:p></p>
<p class=MsoNormal> CS: TRTLCriticalSection;<o:p></o:p></p>
<p class=MsoNormal> LockThreadID: Cardinal;<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>function EnterProc: Boolean;<o:p></o:p></p>
<p class=MsoNormal>const<o:p></o:p></p>
<p class=MsoNormal> Timeout = 2000; // 2 seconds<o:p></o:p></p>
<p class=MsoNormal>var<o:p></o:p></p>
<p class=MsoNormal> ThreadID: Cardinal;<o:p></o:p></p>
<p class=MsoNormal> Start: Cardinal;<o:p></o:p></p>
<p class=MsoNormal> Elapsed: Integer;<o:p></o:p></p>
<p class=MsoNormal> OK: Boolean;<o:p></o:p></p>
<p class=MsoNormal>begin<o:p></o:p></p>
<p class=MsoNormal> EnterCriticalSection(CS);<o:p></o:p></p>
<p class=MsoNormal> ThreadID := GetCurrentThreadID;<o:p></o:p></p>
<p class=MsoNormal> if ThreadID = LockThreadID then<o:p></o:p></p>
<p class=MsoNormal> begin<o:p></o:p></p>
<p class=MsoNormal> Result := False;<o:p></o:p></p>
<p class=MsoNormal> LeaveCriticalSection(CS);<o:p></o:p></p>
<p class=MsoNormal> Exit;<o:p></o:p></p>
<p class=MsoNormal> end;<o:p></o:p></p>
<p class=MsoNormal> OK := True;<o:p></o:p></p>
<p class=MsoNormal> Start := GetTickCount;<o:p></o:p></p>
<p class=MsoNormal> while (LockThreadID <> 0) and OK do<o:p></o:p></p>
<p class=MsoNormal> begin<o:p></o:p></p>
<p class=MsoNormal> Sleep(1);<o:p></o:p></p>
<p class=MsoNormal> Elapsed := GetTickCount-Start;<o:p></o:p></p>
<p class=MsoNormal> OK := (Elapsed >= 0) and (Elapsed <
Timeout);<o:p></o:p></p>
<p class=MsoNormal> end;<o:p></o:p></p>
<p class=MsoNormal> LockThreadID := ThreadID;<o:p></o:p></p>
<p class=MsoNormal> Result := True;<o:p></o:p></p>
<p class=MsoNormal> LeaveCriticalSection(CS);<o:p></o:p></p>
<p class=MsoNormal>end;<o:p></o:p></p>
<p class=MsoNormal><o:p> </o:p></p>
<p class=MsoNormal>procedure LeaveProc;<o:p></o:p></p>
<p class=MsoNormal>begin<o:p></o:p></p>
<p class=MsoNormal> LockThreadID := 0;<o:p></o:p></p>
<p class=MsoNormal>end;<o:p></o:p></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'>Note that I
don’t need speed where these procedures will be used, so the Sleep(1)
delay isn’t an issue.<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'>Now to use it.<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal>var Locked: Boolean;<o:p></o:p></p>
<p class=MsoNormal>begin<o:p></o:p></p>
<p class=MsoNormal> Locked := EnterProc;<o:p></o:p></p>
<p class=MsoNormal> try<o:p></o:p></p>
<p class=MsoNormal style='text-indent:12.0pt'>DoSomething;<o:p></o:p></p>
<p class=MsoNormal> finally<o:p></o:p></p>
<p class=MsoNormal style='text-indent:12.0pt'>If Locked then LeaveProc;<o:p></o:p></p>
<p class=MsoNormal> end;<o:p></o:p></p>
<p class=MsoNormal>end;<o:p></o:p></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'>It appears to
work.<o:p></o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'><o:p> </o:p></span></p>
<p class=MsoNormal><span style='font-size:12.0pt;color:#1F497D'>Ross.<o:p></o:p></span></p>
</div>
</body>
</html>