Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.13;
Скачать: CL | DM;

Вниз

Ошибка при запуске потока   Найти похожие ветки 

 
Frogkiller   (2003-12-25 22:52) [0]

Доброго времени суток, уважаемые Мастера!
Была у меня написанная программа, а сейчас решил я добавить в нее еще один поток. Т.к. с потоками раньше работал только раз, то делать решил по порядку и на каждом этапе проверять работоспособность (обычно пишу все сразу, а потом вылавливаю ошибки). Так вот, первым этапом было у меня запланировано создание "пустого" потока, его запуск и освобождение. Вот что получилось. Основная программа:

unit Unit1;

interface

uses
..., Unit2;

type
TForm1 = class(TForm)
...
CheckBox2: TCheckBox;
...
procedure CheckBox2Click(Sender: TObject);
private
NewThread: TMyThread;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

...

procedure TForm1.CheckBox2Click(Sender: TObject);
begin
if Form1.CheckBox2.Checked then begin
NewThread.Create(True);
end else begin
NewThread.Terminate;
NewThread.Free;
end;
end;

end.


Дополнительный поток:

unit Unit2;

interface

uses
Classes;

type
TMyThread = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

implementation

uses
Unit1;

procedure TMyThread.Execute;
begin
{ Place thread code here }
end;

end.


При компиляции не выдается ни ошибок, ни предупреждениений, в общем все ОК. Проблема в том, что при установке флажка в CheckBox2 происходит исключение:

Project Project1.exe raised exception class EAccessViolation with message "Access violation at address.. и т.д.

При этом дебаггер подсвечивает строку
NewThread.Create(True);

Помогите пожалуйста разобраться в чем дело. Мучаюсь с самого утра. Заранее спасибо.


 
Иван Шихалев ©   (2003-12-25 23:47) [1]

Гм... А с объектами в Delphi вообще работать доводилось?

NewThread := TMyThread.Create(true)


 
Юрий Зотов ©   (2003-12-25 23:51) [2]

NewThread := TMyThread.Create(True);
Это и есть причина AV.

Но ошибка может быть не единственной, возможны еще две.

Во-первых, поток создается в замороженном виде - значит создастся только сам объект, но сам поток (метод Execute) не стартует, пока не будет вызвано Resume. Проверьте логику программы - это действительно так и нужно, или нет?

Во-вторых, если начальное состояние CheckBox2 - Checked, то при первом клике по ней выполнится ветка ELSE - и произойдет обращение к объекту NewThread, КОТОРЫЙ ЕЩЕ НЕ СОЗДАН - тут же будет AV.

Ну и еще одно замечание, общего плана:
if Form1.CheckBox2.Checked then...

Здесь Form1 не только не нужна, но и даже опасна. Этот код написан в методе класса TForm1, поэтому он сработает и без всяких Form1. А вот в Form1 возможна ошибка: стоит только не проинициализировать эту переменную - и будет AV. Если Form1 - главная, то такого не случится, а вот если не главная - запросто может быть. Поэтому не нужно ПРИУЧАТЬ себя к ПЛОХОМУ стилю, а потом ловить из-за этого глюки.



Страницы: 1 вся ветка

Текущий архив: 2004.01.13;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.019 c
1-37648
Cam
2003-12-31 07:53
2004.01.13
DCU


1-37651
Эдуард
2003-12-26 11:32
2004.01.13
Создание компонента в DLL


1-37728
Adil Aliyev
2003-12-30 01:13
2004.01.13
Ярлык


14-37863
Nick-From
2003-12-22 20:38
2004.01.13
Халява?


1-37674
Raduga
2003-12-26 13:53
2004.01.13
help по созданию сервисов Windows