下面的代码会在创建线程后将焦点从Edit1更改为Edit2时冻结应用程序. 重现步骤: 单击“创建线程”按钮 在Edit1 / Edit2之间切换焦点. 我认为线程内部的ADO对象创建导致应用程序冻结. 有没
重现步骤:
>单击“创建线程”按钮
>在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, 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' );
至
FEvent := TEvent.Create(nil, false, false, 'test', true );