Fastream Technologies wrote:
> Hello,
>
> So this is my latest code:
>
> void inline __fastcall lockCriticalSection(TCriticalSection
> *criticalSection) {
> for(int i = 0; i < 5000; ++i)
> {
> if(criticalSection->TryEnter())
> return;
Calling Sleep() in such short intervals is critical.
With each call to Sleep() you force a context switch, this will
slow down entire application and may lead to strange results.
Try something like the class below (untested), copy the code
to a new file, name it MySyncObjs.pas and replace SyncObjs by
MySyncObjs in your uses clause (works only if you do not use
other objects from that unit as well). I use MadExept 2.7.
--------------------------------------------------------------
unit MySyncObjs;
interface
uses
Windows, Sysutils, MadExcept;
type
ECriticalSection = class(Exception);
TCriticalSection = class(TObject)
protected
FMutex : THandle;
public
constructor Create;
destructor Destroy; override;
procedure Acquire;
procedure Release;
procedure Enter;
procedure Leave;
end;
implementation
{ TCriticalSection }
constructor TCriticalSection.Create;
begin
FMutex := CreateMutex(nil, FALSE, nil);
if FMutex = 0 then
ECriticalSection.Create(SysErrorMessage(GetLastError));
end;
destructor TCriticalSection.Destroy;
begin
if FMutex <> 0 then
CloseHandle(FMutex);
inherited;
end;
procedure TCriticalSection.Acquire;
begin
Enter
end;
procedure TCriticalSection.Enter;
var
WaitResult: Cardinal;
begin
try
WaitResult := WaitForSingleObject(FMutex, 5000);
case WaitResult of
WAIT_TIMEOUT : raise ECriticalSection.Create('Critical Section timed
out');
WAIT_ABANDONED: raise ECriticalSection.Create('Critical Section
abandoned');
WAIT_FAILED: raise ECriticalSection.Create(SysErrorMessage(GetLastError));
end;
except
MadExcept.HandleException;
end;
end;
procedure TCriticalSection.Leave;
begin
Release
end;
procedure TCriticalSection.Release;
begin
if not ReleaseMutex(FMutex) then
ECriticalSection.Create(SysErrorMessage(GetLastError));
end;
end.
--------------------------------------------------------------
--
Arno Garrels [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be