Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.13;
Скачать: CL | DM;

Вниз

Форма внутри потока   Найти похожие ветки 

 
_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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.029 c
7-39120
НВ
2003-11-28 18:23
2004.02.13
Как послать управляющие коды на принтер?


3-38735
Александр Богданов
2004-01-19 20:35
2004.02.13
сводные таблицы средствами SQL


4-39137
~GaMeRd~
2003-12-10 21:51
2004.02.13
ХТМЛ


1-38868
denis24
2004-02-02 10:54
2004.02.13
как переделать компонет написанный на d4 под d5


14-39057
Феликс
2004-01-23 21:46
2004.02.13
Вопрос по физике