创建线程

时间:2015-07-21 10:51:06

标签: multithreading delphi debugging delphi-2010 virtualtreeview

我遇到一个问题,即当我运行一个线程时,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并且工作正常。这很神秘。

0 个答案:

没有答案