首页 > 代码库 > Delphi写的DLL,OCX中多线程一个同步问题
Delphi写的DLL,OCX中多线程一个同步问题
Delphi写的DLL,OCX中如果使用了TThread.Synchronze(Proc),可能导致线程死锁,原因是无法唤醒EXE中主线程,
Synchronze并不会进入EXE主线程消息队列.
下面的程序自动解决此问题,只需要加入DLL,OCX工程文件中,在DLL,OCX中便可以使用TThread.Synchronze(Proc)了,无需再写一行代码。
//解决Delphi编译的DLL,OCX文件中的线程调用 TThread.Synchronize后挂起无法再激活问题//调用了TThread.Synchronize函数的所有工程请包含此文件//仅需将此单元包含到工程文件即可unit Lib.Common.DLLThread;interfaceimplementationuses Classes, Windows, Messages;type { TDLLSystemController } TDLLSystemController = class private FHandle: HWND; FPrevWakeMainThread: TNotifyEvent; procedure WakeMainThread(Sender: TObject); procedure HookSynchronizeWakeup; procedure UnhookSynchronizeWakeup; protected procedure WndProc(var Message: TMessage); public constructor Create; destructor Destroy; override; end;var FDLLController:TDLLSystemController;{ TDLLSystemController }constructor TDLLSystemController.Create;begin inherited; if IsLibrary then begin FHandle := AllocateHWnd(WndProc); HookSynchronizeWakeup; end;end;destructor TDLLSystemController.Destroy;begin if IsLibrary then begin DeallocateHWnd(FHandle); UnhookSynchronizeWakeup; end; inherited;end;procedure TDLLSystemController.WndProc(var Message: TMessage);begin case Message.Msg of WM_NULL: CheckSynchronize; else Message.Result := DefWindowProc(FHandle, Message.Msg, Message.wParam, Message.lParam); end;end;procedure TDLLSystemController.WakeMainThread(Sender: TObject);begin PostMessage(FHandle, WM_NULL, 0, 0);end;procedure TDLLSystemController.HookSynchronizeWakeup;begin FPrevWakeMainThread := Classes.WakeMainThread; Classes.WakeMainThread := WakeMainThread;end;procedure TDLLSystemController.UnhookSynchronizeWakeup;begin Classes.WakeMainThread := FPrevWakeMainThread;end;initialization if IsLibrary then FDLLController := TDLLSystemController.Create else FDLLController:=nil;finalization if Assigned(FDLLController) then FDLLController.Free;end.
Delphi写的DLL,OCX中多线程一个同步问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。