Delphi程序在调整Windows键盘布局时,为何会出现应用卡死现象?

2026-04-10 18:212阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计703个文字,预计阅读时间需要3分钟。

Delphi程序在调整Windows键盘布局时,为何会出现应用卡死现象?

下面的代码会在创建线程程序后,将Edit1中的焦点从Edit2更改为Edit1。如果线程内部创建了ADO对象,可能导致应用程序冻结。

步骤:

1.单击创建线程按钮。

2.在Edit1和Edit2之间切换焦点。

代码:

pythonimport threading

def change_focus(): # 假设这里有一些操作导致应用程序冻结 # 模拟ADO对象创建 ado_object=None

# 模拟焦点切换 print(切换焦点:从Edit2到Edit1)

def create_thread(): thread=threading.Thread(target=change_focus) thread.start()

创建线程create_thread()

注意:- 代码中未使用任何外部库。- 代码假设存在两个编辑框(Edit1和Edit2)和创建线程按钮。- 代码未实际切换焦点,而是打印了一条消息来模拟焦点切换。

下面的代码会在创建线程后将焦点从Edit1更改为Edit2时冻结应用程序.

重现步骤:

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

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

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

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

同样的问题:

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, 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, 8)), 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, false, false, 'test' );

Delphi程序在调整Windows键盘布局时,为何会出现应用卡死现象?

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

本文共计703个文字,预计阅读时间需要3分钟。

Delphi程序在调整Windows键盘布局时,为何会出现应用卡死现象?

下面的代码会在创建线程程序后,将Edit1中的焦点从Edit2更改为Edit1。如果线程内部创建了ADO对象,可能导致应用程序冻结。

步骤:

1.单击创建线程按钮。

2.在Edit1和Edit2之间切换焦点。

代码:

pythonimport threading

def change_focus(): # 假设这里有一些操作导致应用程序冻结 # 模拟ADO对象创建 ado_object=None

# 模拟焦点切换 print(切换焦点:从Edit2到Edit1)

def create_thread(): thread=threading.Thread(target=change_focus) thread.start()

创建线程create_thread()

注意:- 代码中未使用任何外部库。- 代码假设存在两个编辑框(Edit1和Edit2)和创建线程按钮。- 代码未实际切换焦点,而是打印了一条消息来模拟焦点切换。

下面的代码会在创建线程后将焦点从Edit1更改为Edit2时冻结应用程序.

重现步骤:

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

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

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

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

同样的问题:

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, 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, 8)), 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, false, false, 'test' );

Delphi程序在调整Windows键盘布局时,为何会出现应用卡死现象?

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