Вниз
Скачать: 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.017 c
14-39061
Thor
2004-01-24 23:58
2004.02.13
Спрятать иконку в Systray...


3-38687
3APA3A
2004-01-23 18:27
2004.02.13
Выборка, нечуствительная к регистру букв...


11-38762
Кладов
2003-05-27 21:47
2004.02.13
Версия 1.74 дождалась своего часа (в смысле моего отпуска)


3-38731
VID
2004-01-18 02:56
2004.02.13
К теме о странном поведении fibplus при неудачном коннекте


3-38734
Kalinka
2004-01-21 16:07
2004.02.13
При переходе с SQL Server 7.0 на SQL Server 2000 происходят стран




   Наверх