Threadübergreifend geht eine CriticalSection, aber nicht innerhalb eines Threads...
Ich würde eine Semaphore nehmen und damit die kritischen Teile kapseln:
Delphi-Quellcode:
TThreadCriticalSection= Class
private
fSemaphore: THandle;
public
Constructor Create;
Destructor Destroy; override;
Procedure Enter;
Procedure Leave;
End;
Constructor TThreadCriticalSection.Create;
Begin
fSemaphore := CreateSemaphore(Nil, 1, 1, Nil);
End;
Destructor TThreadCriticalSection.Destroy;
Begin
closeHandle(fSemaphore);
End;
Procedure TThreadCriticalSection.Enter;
Begin
WaitForSingleObject(fSemaphore, INFINITE)
End;
Procedure TThreadCriticalSection.Leave;
Begin
ReleaseSemaphore(fSemaphore, 1, Nil);
End;
Dann so:
Delphi-Quellcode:
Procedure TMyClass.MyEvent;
Begin
MyThreadCriticalSection.Enter;
Try
DoExclusiveStuff
Finally
MyThreadCriticalSection.Leave;
End;
End;
@Luckie: Dann blinkt der Button ja ständig. (Timer alle 100ms)