Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
ВнизФорма внутри потока Найти похожие ветки
← →
_Dmitry_ (2004-02-04 15:42) [0]Помогите пожалуста разобраться с ошибкой
Я пытаюсь показывать форму во время выполнения действий в потоке
вот код:
TThreadProjectStat = class(TThread)
private
FForm:TProgressForm;
public
procedure Execute; override;
constructor Create;
. . . . . . . . . .
destructor Destroy; override;
end;
constructor TThreadProjectStat.Create;
begin
FForm := TProgressForm.Create(Application);
FForm.Show;
FreeOnTerminate := True;
inherited Create(False);
end;
destructor TThreadProjectStat.Destroy;
begin
FForm.Free;
inherited;
end;
procedure TThreadProjectStat.Execute;
begin
inherited;
. . . . . . . . . .
FForm.Close;
. . . . . . . . . .
end;
При попытке сделать FForm.Free вылетает ошибка
EOSError "System Error. Code 5. Отказанно в доступе"
← →
Digitman (2004-02-04 16:01) [1]создаешь ты форму в основном потоке, а доступ к ее методам пытаешься осуществлять в дополнительном ... вот отсюда и проблема
← →
_Dmitry_ (2004-02-04 16:04) [2]Вовсе нет,
см. код
в конструкторе потока создаю форму
constructor TThreadProjectStat.Create;
begin
FForm := TProgressForm.Create(Application);
....
← →
Digitman (2004-02-04 16:11) [3]
> в конструкторе потока создаю форму
конструктор (как и любой другой метод класса или объекта) выполняется в том кодовом потоке, который его вызвал
← →
_Dmitry_ (2004-02-04 16:20) [4]И что?
Ничего не понял, что мне делать?
Я создаю форму в потоке, в нем же осуществляю доступ к полям, в нем же пытаюсь его уничтожить.
← →
h0use (2004-02-04 16:27) [5]Есть мнение, что тебе нужно создавать форму в Execute, а не в Create ;)
← →
Digitman (2004-02-04 16:33) [6]
> Я создаю форму в потоке
да, в потоке ... в основном, еще раз повторяю
> в нем же осуществляю доступ
не в нем же ... а уже в дополнительном ! Все что происходит в теле Execute, происходит уже в доп.потоке
> в нем же пытаюсь его уничтожить
действительно, закрываешь окно формы и пытаешься уничтожить объект формы в дополнительном...
а доступ подавляющему большинству свойств/методов формы как VCL-объекта недопустим в контексте дополнительного потока, только - в контексте основного потока это допустимо
p.s.
бросай эту затею, она неверна как минимум с концептуальной т.з. на использование доп.код.потоков для работы с польз.интерфейсом приложения
← →
_Dmitry_ (2004-02-04 16:36) [7]Я уже пробовал в Execute, но в этом случае программа просто подвисает, а конструктор формы даже не вызывается.
← →
h0use (2004-02-04 16:38) [8]Тогда создавай свою форму в основном потоке, а элементы управления синхронизируй с дополнительным.
← →
_Dmitry_ (2004-02-04 16:40) [9]> бросай эту затею, она неверна как минимум с концептуальной т.з.
идея вот в чем. В программе есть множество дейсвий которые выполняются продолжительное время. Хотелось сделать универсальное окно которое показывало бы ход дейсвия и которым мог бы владеть каждый поток.
А если я буду просто закрывать не вызывая FForm.Free автоматически окно будет уничтожено?
И какже мне быть? :(
← →
_Dmitry_ (2004-02-04 16:42) [10]2 h0use - действительно,
так и сделаю.
спасибо большое :)
← →
panov (2004-02-04 16:42) [11]>_Dmitry_ (04.02.04 15:42)
Формы в Delphi реализованы так, что работают только в основном потоке.
← →
Digitman (2004-02-04 16:42) [12]еще раз говорю - бросай эту затею) .. неверна она хотя бы даже концеатуально
доп.код.поток предназначен для выполнения длительных вычислений, параллельно с другими кодовыми потоками
в форму доп.поток лезть не должен, а если уж это крайне необходимо (например, для получения какого-то св-ва объекта-формы), то доп.код.поток должен синхронизировать свои обращения к форме с осн.код.потоком ... для этого, например, есть метод TThread.Synchronize(). которого в большинстве случаев вполне достаточно для целей синхронизации
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.02.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c