中国开发网: 论坛: 程序员情感CBD: 贴子 378051
mhappy
别争了,这里。。。
class procedure TThread.Synchronize(ASyncRec: PSynchronizeRecord; QueueEvent: Boolean = False);
var
SyncProc: TSyncProc;
SyncProcPtr: PSyncProc;
begin
if GetCurrentThreadID = MainThreadID then
ASyncRec.FMethod
else
begin
if QueueEvent then
New(SyncProcPtr)
else
SyncProcPtr := @SyncProc;
{$IFDEF MSWINDOWS}
if not QueueEvent then
SyncProcPtr.Signal := CreateEvent(nil, True, False, nil)
else
SyncProcPtr.Signal := 0;
try
{$ENDIF}
{$IFDEF LINUX}
FillChar(SyncProcPtr^, SizeOf(SyncProcPtr^), 0); // This also initializes the cond_var
{$ENDIF}
EnterCriticalSection(ThreadLock);
try
SyncProcPtr.Queued := QueueEvent;
if SyncList = nil then
SyncList := TList.Create;
SyncProcPtr.SyncRec := ASyncRec;
SyncList.Add(SyncProcPtr);
SignalSyncEvent;
if Assigned(WakeMainThread) then
WakeMainThread(SyncProcPtr.SyncRec.FThread);
if not QueueEvent then
{$IFDEF MSWINDOWS}
begin
LeaveCriticalSection(ThreadLock);
try
WaitForSingleObject(SyncProcPtr.Signal, INFINITE);
finally
EnterCriticalSection(ThreadLock);
end;
end;
{$ENDIF}
{$IFDEF LINUX}
pthread_cond_wait(SyncProcPtr.Signal, ThreadLock);
{$ENDIF}
finally
LeaveCriticalSection(ThreadLock);
end;
{$IFDEF MSWINDOWS}
finally
if not QueueEvent then
CloseHandle(SyncProcPtr.Signal);
end;
{$ENDIF}
if not QueueEvent and Assigned(ASyncRec.FSynchronizeException) then
raise ASyncRec.FSynchronizeException;
end;
end;

procedure TThread.Synchronize(AMethod: TThreadMethod);
begin
FSynchronize.FThread := Self;
FSynchronize.FSynchronizeException := nil;
FSynchronize.FMethod := AMethod;
Synchronize(@FSynchronize);
end;

class procedure TThread.Synchronize(AThread: TThread; AMethod: TThreadMethod);
var
SyncRec: TSynchronizeRecord;
begin
if AThread <> nil then
AThread.Synchronize(AMethod)
else
begin
SyncRec.FThread := nil;
SyncRec.FSynchronizeException := nil;
SyncRec.FMethod := AMethod;
TThread.Synchronize(@SyncRec);
end;
end;
//bds2006 classes.pas

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录