1

У меня проблема с тем, что Delphi (2010) IDE и программа зависают во время отладки при запуске потока. Оба окна не отвечают. Когда я убиваю программу, IDE работает снова.Delphi IDE зависает при создании потока

Понадобилось время, мне пришлось удалить кусочки моей программы, и я нашел проблему. Это вызвано VirtualStringTree.

Так что, если я ставлю только пустой VirtualStringTree (v. 5.5.3) на форму, одну кнопку выполнить TThread с помощью «Sleep (2000)» в процедуре Execute и запустить такую ​​программу под отладчиком, она зависает (обычно сначала нажмите). Когда я удаляю 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. 

EDIT:
Я также пытался отладить процесс Delphi. Я привязался от второй к первой IDE. Когда я нажимаю кнопку, чтобы начать поток, обе IDE зависают. Поэтому я попытался с Delphi 7, который я также установил. Это сработало. Он находится в петле где-то в ntdll.NtWaitForMultipleObjects, KERNELBASE.WaitForMultipleObjectsEx, USER32.MsgWaitForMultipleObjects.

Я полностью переустановил Delphi, без изменений. Он также может быть связан с этой строкой в ​​источнике VirtualStringTree: «WaitForSingleObject (WorkEvent, INFINITE);». Когда я удаляю его, он не замерзает. Но я думаю, что это необходимо.

Наконец, я установил Delphi 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