Главная страница
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.017 c
3-37542
Bless
2003-12-15 17:41
2004.01.13
Как получить результат работы функции raiserror( nefart ,10,10)


1-37760
andruxin
2003-12-29 17:22
2004.01.13
Как разукрасить TListView.


14-37892
excess
2003-12-22 10:09
2004.01.13
Чат мастеров.


6-37829
Bill
2003-11-11 03:42
2004.01.13
Cannot allocate socket.


14-37919
SergP
2003-12-20 11:25
2004.01.13
(NMHTTP, IDHTTP) POST & PHP . Еще одна проблема...