1

我有一个问题,即在运行一个线程时,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,并正常工作。这是神秘的。

+0

现在还不清楚背景是什么。设计时间包。在调试器下运行的可执行文件?或者是其他东西。请给出精确的步骤来重现。 –

+0

我稍微修改了它。是的,它可以在调试器下执行。只需一个VirtualStringTree和一个按钮即可运行任何TThread。 – smooty86

+0

你能否包含一个能够重现这一点的小程序的完整源代码? (因为它看起来像一个小程序会重现它...) –

回答

-1

TTestThread是代码中TThread的后代,但它仍然需要变量声明和适当的构造函数调用。

var 
    MyThread: TTestThread; 

正确的调用初始化它会

MyThread := TTestThread.Create(False); 

,而不是试图为您在按钮单击事件必须调用构造函数。

祝你好运,玩得开心。

RP

+1

感谢您的关注,但这不是导致IDE和程序挂起的问题。我通常使用变量,但对测试用例不是必需的。如果你使用变量没有区别,它不会引起任何问题,它只是不被保存在变量中。 – smooty86

+0

实际上@Radical,如果您按照您的建议(假设为本地)添加变量,那么编译器会生成一条提示,建议您不使用分配的值。此外,编译器不会生成设置变量的代码 - 因为没有意义。 –

+0

@Craig - 如果编译器正在生成该提示,那么很可能基类仍然被直接调用(调用TTestThread而不是MyThread)。 RP – RadicalPumpkin

相关问题