zoukankan      html  css  js  c++  java
  • 最近遇到程序开启线程后,在主界面编辑框中切换输入法,程序就卡住,只有强制关闭

    function TCFADODBStorage.OpenConnection: Boolean;
    
      //线程里打开ADOConnection,在XP下切换输入法程序会死掉
      //原因:ADO自动创建一个ADODB.AsyncEventMessenger窗口,然后会有一个对应的IME窗口,但线程里没有消息循环
      //     XP下输入法切换时会SendMessage给IME窗口并等待返回,IME窗口并不会处理消息,造成死锁
      //这个函数把线程里的IME窗口释放掉,切换输入法时就不会有消息过来了
      procedure _FreeIMEWindow;
      const
        IME_WINDOW_CLASS = 'IME';
        IME_WINDOW_TEXT  = 'Default IME';
      var
        h : HWND;
        pid : DWORD;
        dh : HWND;
      begin
        h :=  FindWindow(IME_WINDOW_CLASS, IME_WINDOW_TEXT);
        while IsWindow(h) do
        begin
          if GetWindowThreadProcessId(h, pid) = GetCurrentThreadId then
            dh  :=  h
          else
            dh  :=  0;
          h :=  FindWindowEx(0, h, IME_WINDOW_CLASS, IME_WINDOW_TEXT);
          if dh <> 0 then
            DestroyWindow(dh);
        end;
      end;
    
    begin
      try
        FConnection.ConnectionString  :=  ConnectionString;
        FConnection.Connected :=  True;
        if GetCurrentThreadId <> Global.MainThreadID{全局的主线程ID,如果是主线程,不需要Free} then
          _FreeIMEWindow;
      except on E: Exception do
        FLastErrorMessage :=  e.Message;
      end;
      Result  :=  FConnection.Connected;
    end;
  • 相关阅读:
    pytorch获取模型某一层参数名及参数值方式
    PyTorch源码解读之torchvision.models
    torch.nn.Conv2d()函数详解
    UCF101
    ipynb格式转换
    linux下的压缩与解压缩
    tomcat 部署的项目图片名字带中文
    恢复oracle误删除数据
    项目中遇到的分布式高并发情况及解决方案
    poi 导出复杂表头 execl
  • 原文地址:https://www.cnblogs.com/moonwind/p/4492067.html
Copyright © 2011-2022 走看看