Главная страница
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.013 c
6-37827
AlexanderSK
2003-11-10 16:54
2004.01.13
Несколько HTTP запросов один за одним


1-37750
LeWorm
2003-12-28 12:19
2004.01.13
Размер Scroll а


4-37989
stas kalishenko
2003-10-30 18:49
2004.01.13
Сервис и Novell-овский сетевой диск


1-37643
KIE
2003-12-22 14:01
2004.01.13
Массивы.


1-37686
Vitaliygavrilov
2003-12-26 11:20
2004.01.13
как сделать недоступным раскрытие до полного окна