Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.026 c
1-38904
Ajax
2004-01-30 12:03
2004.02.13
Выпадающий список ComboBox


14-39036
otido
2004-01-24 22:26
2004.02.13
ПОмогите пожалуйста, проблема со свичом и сетевухой 3Сом((


7-39118
Cash
2003-11-30 00:39
2004.02.13
Поиск в папках и подпапках


3-38758
sils
2004-01-21 10:19
2004.02.13
Помогите с TQuery


1-38780
staryx
2004-02-03 16:21
2004.02.13
WML 1.1




   Наверх