以下代码会在创建线程后将焦点从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
答案 0 :(得分:1)
解决了它。
在pas文件中更改行
CoInitializeEx(nil,
COINIT_MULTITHREADED
);
到
CoInitializeEx(nil,
COINIT_APARTMENTTHREADED
);
和
FEvent := TEvent.Create(nil,
false,
false,
'test'
);
到
FEvent := TEvent.Create(nil,
false,
false,
'test',
true
);