加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 更改Windows键盘布局时应用程序冻结

发布时间:2020-12-15 09:11:43 所属栏目:大数据 来源:网络整理
导读:下面的代码会在创建线程后将焦点从Edit1更改为Edit2时冻结应用程序. 重现步骤: 单击“创建线程”按钮 在Edit1 / Edit2之间切换焦点. 我认为线程内部的ADO对象创建导致应用程序冻结. 有没有人知道什么是确切的问题? 注意:我想当更改默认输入语言时会出现问
下面的代码会在创建线程后将焦点从Edit1更改为Edit2时冻结应用程序.

重现步骤:

>单击“创建线程”按钮
>在Edit1 / Edit2之间切换焦点.

我认为线程内部的ADO对象创建导致应用程序冻结.

有没有人知道什么是确切的问题?

注意:我想当更改默认输入语言时会出现问题.
Win xp – 文本服务和输入语言对话框 – 默认输入语言.

同样的问题:

http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/1d27c2ad-7ef1-45e9-b9af-6bfb458c1165

pas文件

unit Unit1;

interface

uses
  Windows,Messages,SysUtils,Variants,Classes,Graphics,Controls,Forms,Dialogs,ADODB,SyncObjs,ActiveX,ComObj,Menus,StdCtrls;

type

  TMyThread = class(TThread)
  private
    FEvent : TEvent;
    adoConnection : TADOConnection;
  protected
    procedure Execute; override;
  public
    constructor Create(ASuspended : boolean);
    destructor Destroy; override;
  end;


  TForm1 = class(TForm)
    Edit1: TEdit;
    Edit2: TEdit;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure TextEdit1Enter(Sender: TObject);
    procedure TextEdit2Enter(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    MyThread : TMyThread;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyThread }

constructor TMyThread.Create(ASuspended: boolean
                            );
begin
  inherited Create(ASuspended);
  FEvent := TEvent.Create(nil,false,'test'
                          );
end;

destructor TMyThread.Destroy;
begin
  FreeAndNil(FEvent);
  inherited;
end;

procedure TMyThread.Execute;
begin
  CoInitializeEx(nil,COINIT_MULTITHREADED
                );
  try
    adoConnection := TADOConnection.Create(nil);
    FEvent.WaitFor(INFINITE);
    adoConnection.Free;
  finally
    CoUnInitialize;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyThread.Resume;
end;

procedure TForm1.TextEdit1Enter(Sender: TObject);
begin
  LoadKeyboardLayout(PChar(IntToHex(1081,8)),KLF_ACTIVATE);
end;

procedure TForm1.TextEdit2Enter(Sender: TObject);
begin
  LoadKeyboardLayout(PChar(IntToHex(1043,KLF_ACTIVATE);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  MyThread.FEvent.SetEvent;
  MyThread.Terminate;
  FreeAndNil(MyThread);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyThread := TMyThread.Create(true);
end;

end.

表格文件

object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 115
  ClientWidth = 147
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnClose = FormClose
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Edit1: TEdit
    Left = 8
    Top = 8
    Width = 121
    Height = 21
    TabOrder = 0
    Text = 'Edit1'
    OnEnter = TextEdit1Enter
  end
  object Edit2: TEdit
    Left = 8
    Top = 35
    Width = 121
    Height = 21
    TabOrder = 1
    Text = 'Edit2'
    OnEnter = TextEdit2Enter
  end
  object Button1: TButton
    Left = 8
    Top = 62
    Width = 121
    Height = 45
    Caption = 'Create Thread'
    TabOrder = 2
    WordWrap = True
    OnClick = Button1Click
  end
end

解决方法

解决了它.

在pas文件中更改行

CoInitializeEx(nil,COINIT_MULTITHREADED
                );

CoInitializeEx(nil,COINIT_APARTMENTTHREADED
                );

FEvent := TEvent.Create(nil,'test'
                          );

FEvent := TEvent.Create(nil,'test',true
                          );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读