Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
1-37736
serg128
2003-12-30 13:07
2004.01.13
Kak получить номер (индекс) выбранного узла в TTreeView?


14-37937
}|{yk
2003-12-19 18:45
2004.01.13
Помогите выбрать мобильный!


14-37900
Viktor Kushnir
2003-12-15 14:03
2004.01.13
Redirect


11-37600
Centronix
2003-04-24 14:45
2004.01.13
Создание диалогового окна


1-37677
Witcher
2003-12-26 13:07
2004.01.13
Системы счисления





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский