我有一个问题,即在运行一个线程时,Delphi(2010)IDE和程序都在调试过程中挂起。 两个窗口都不响应。当我杀死程序时,IDE再次运行。当我创建一个线程时,Delphi IDE挂起
花了时间,我不得不删除我的程序片断,我发现了问题。 它是由VirtualStringTree引起的。
因此,如果我在窗体上只放置了空的VirtualStringTree(v.5.5.3),一个按钮在Execute过程中只用“Sleep(2000)”执行TThread并在调试器下运行此程序,它会挂起点击)。当我删除VST时,它工作。 我也注意到Windows报告服务已启动,但我在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);”。当我删除它时,它不会冻结。但我认为这是必要的。
最后,我安装了德尔福XE,并正常工作。这是神秘的。
现在还不清楚背景是什么。设计时间包。在调试器下运行的可执行文件?或者是其他东西。请给出精确的步骤来重现。 –
我稍微修改了它。是的,它可以在调试器下执行。只需一个VirtualStringTree和一个按钮即可运行任何TThread。 – smooty86
你能否包含一个能够重现这一点的小程序的完整源代码? (因为它看起来像一个小程序会重现它...) –