Форум: "Основная";
Текущий архив: 2004.01.13;
Скачать: [xml.tar.bz2];
ВнизОшибка при запуске потока Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c