• Delphi Dll中多线程无法使用Synchronize同步的解决方法(转)


    具体原因可以参考这篇文章
    “DLL/ActiveForm中的线程同步处理”www.delphibbs.com/keylife/iblog_show.asp。

    事实上,经试验可以在dll工程文件中加入以下语句 :

    Application.Initialize;

    if Application.Handle = 0 then
    begin
        Application.CreateHandle;
    end;

    Application.Run;

    解决线程中使用Synchronize 假死的问题,或者在线程中直接使用SendMessage替代Synchronize
    同步。

    原因在于若工程文件是DLL而不是EXE的话,Application默认不创建窗口句柄,因此Synchronize
    向Application发送消息根本无法响应,手动创建句柄,并让其进入消息循环状态可以解决

    转自http://hi.baidu.com/ferrylife/blog/item/c3a9ab51dc359e888d543021.html

    用以上方法。会因为application的值不同而在任务栏上产生两个按钮
    function SetApplicationHandle(AppHandle: THandle): Boolean; stdcall;
    begin
      try
        Application.Initialize;
        if Application.Handle = 0 then
          begin
            Application.CreateHandle;
          end;
        Application.Handle:= AppHandle;
        Application.Run;
        Result:= True;
      except
        Result:= False;
      end;
    end;


    在dll中导入一个函数
    在主线程中调用传入application.handle使任务栏按钮变回一个


    type
        TExportEmuFormApplication = function(AppHandle: THandle): Boolean; stdcall;

    ......
    private
        FAppHandle: TExportEmuFormApplication;
        FDLLHandle: THandle;
    ......


    implementation

    constructor TEmuMap.Create(aParent: TComponent);
    begin
      FDLLHandle := LoadLibrary('emudll.dll');
      try
        FAppHandle:= GetProcAddress(FDLLHandle, 'SetApplicationHandle');

        if not (@FAppHandle = nil) then
          begin
            FAppHandle(Application.Handle);
          end;

    ......
    end;

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/tomliks/archive/2009/08/07/4421347.aspx

    PS: 如果用了FASTMM4,替换Application.Handle会出错!

    所以可以用

    在工程里家Application.MainFormOnTaskBar:= False ;

    在onshow 里加入:ShowWindow(Application.Handle, SW_HIDE); //不在任务栏显示

  • 相关阅读:
    JSP 使用
    Spring MVC 读取静态资源时404错误
    Java及Android开发环境搭建
    堆和栈的区别
    fork Bomb
    Hbase Shell常用命令
    CSS选择器的系统介绍
    JavaScript中的位置坐标
    JavaScript事件
    战略型、战术型
  • 原文地址:https://www.cnblogs.com/enli/p/1837728.html
Copyright © 2020-2023  润新知