我遇到一个问题,即当我运行一个线程时,Delphi(2010)IDE和程序都会在调试期间挂起。 两个窗口都没有响应。当我杀死程序时,IDE再次运行。
花了一些时间,我不得不删除我的程序,我发现了问题。 它是由VirtualStringTree引起的。
因此,如果我在表单上放置一个空的VirtualStringTree(v.5.5.3),只需一个按钮来执行TThread,只需" Sleep(2000)"在执行过程中并在调试器下运行此类程序,它会挂起(通常在第一次单击时)。当我删除VST时,它可以工作。 我还注意到Windows Reporting Service已启动,但我在Windows事件日志中找不到任何内容。
有没有人知道这是怎么回事?
这里有完整的来源
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, VirtualTrees, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
VirtualStringTree1: TVirtualStringTree;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TTestThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ TTestThread }
procedure TTestThread.Execute;
begin
FreeOnTerminate:=True;
Sleep(2000);
end;
{ TForm }
procedure TForm1.Button1Click(Sender: TObject);
begin
TTestThread.Create(False);
end;
end.
修改
我也试过调试Delphi进程。我从第二个IDE连接到第一个IDE。当我单击按钮启动线程时,两个IDE都挂起。所以我尝试使用Delphi 7,我也安装了它。那很有效。它保留在ntdll.NtWaitForMultipleObjects,KERNELBASE.WaitForMultipleObjectsEx,USER32.MsgWaitForMultipleObjects中的某个循环中。
我完全重新安装了Delphi,没有变化。它也可能与VirtualStringTree源中的这一行有关:" WaitForSingleObject(WorkEvent,INFINITE);"。当我删除它时,它不会冻结。但我觉得那里有必要。
最后我安装了Delphi XE并且工作正常。这很神秘。