中国开发网: 论坛: 程序员情感CBD: 贴子 60560
王中王: Synchronize时,线程会先进入一个ThreadLock临界区,这时Pause一个线程的话,就是影响其它线程的Synchronize操作,你有没有什么好办法?
procedure TThread.Synchronize(Method: TThreadMethod);
var
SyncProc: TSyncProc;
begin
if GetCurrentThreadID = MainThreadID then
Method
else
begin
SyncProc.Signal := CreateEvent(nil, True, False, nil);
try
EnterCriticalSection(ThreadLock);
try
//进入临界区后,如果此时线程被Suspend,那么其它线程的Synchronize操作就全卡在这了,所有的线程都会中止
//ThreadLock可见范围不是全局的,是单元的

FSynchronizeException := nil;
FMethod := Method;
SyncProc.Thread := Self;
SyncList.Add(@SyncProc);
ProcPosted := True;
if Assigned(WakeMainThread) then
WakeMainThread(Self);
LeaveCriticalSection(ThreadLock);
try
WaitForSingleObject(SyncProc.Signal, INFINITE);
finally
EnterCriticalSection(ThreadLock);
end;
finally
LeaveCriticalSection(ThreadLock);
end;
finally
CloseHandle(SyncProc.Signal);
end;
if Assigned(FSynchronizeException) then raise FSynchronizeException;
end;
end;
http://wangzw.wordpress.com/
个性化台历、日历制作
http://shop33697570.taobao.com/

相关信息:


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