Главная страница
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.014 c
1-37642
MScorp
2003-12-26 17:34
2004.01.13
Получить Handle без Application


6-37815
UNick
2003-11-14 16:14
2004.01.13
Как мне задать тему письма


1-37707
@tom
2003-12-24 20:28
2004.01.13
Ошибка загрузки файла в RichEdit


1-37775
Proglam-ma
2003-12-29 15:49
2004.01.13
Динамика в Записях


1-37654
SoS
2003-12-26 19:45
2004.01.13
не ставиться RxLibrary на 7-й делфи, пишет ошибки