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

Вниз

окна в потоках %-)   Найти похожие ветки 

 
ddenis   (2003-10-30 14:25) [0]

Всем привет!

Есть приложение, все его окна открываются модальными. Эта модальность уже порядком мешает, поэтому решено сделать их немодальными. Но! Можно пойти таким путем: для каждого окна создавать отдельный поток и в нем открывать это окно. Таким образом можно будет запускать одновременно из одного экземпляра приложения несколько долгоиграющих процедур (в разных окнах) и они как бы не будут друг другу мешать в плане скорости выполнения (ну почти) и самое главное - они будут выполняться параллельно! Есть конечно нюансы, связанные с доступом к БД, но вроде бы все решаемо. Как Вам такой подход? Интересны мнения, мысли, критика. Спасибо.


 
Mystic ©   (2003-10-30 14:38) [1]

VCL не поддерживает формы с обработчиком сообщений в отдельном потоке. Это можно реализовать только на чистом Win API. В таких ситуациях обычно главный поток отвечает только за отображение всех окон, а далее с каждой длительной задачей всязывается отдельный поток (потоки)


 
Digitman ©   (2003-10-30 14:51) [2]


> Как Вам такой подход?


плохой подход. очень плохой !
начиная с непонимания разницы и взаимосвязи между VCL-формой как VCL-объектом и окном как объектом ОС.


 
ddenis   (2003-10-30 14:55) [3]

Т.е. такая конструкция работать не будет?

procedure TMyThread.Execute;
var
frm: TMyForm;
begin
with TMyForm.Create(Application) do
try
FItsTimeToClose := false;
Show;
while not Terminated and not FItsTimeToClose do
sleep(100);
finally
Free;
end;
end;

...

procedure TMyForm.CloseButtonClick(Sender: TObject);
begin
FItsTimeToClose := true;
close;
end;

Примерно так. Что скажете?


 
ddenis   (2003-10-30 15:03) [4]

> начиная с непонимания разницы и взаимосвязи между VCL-формой как VCL-объектом и окном как объектом ОС

А в чем проблема, хотя бы вкратце?


 
Digitman ©   (2003-10-30 15:08) [5]


> такая конструкция работать не будет?


ожидаемым образом - нет, не будет.
уже при попытке визуализации формы (Show) ты получишь исключение.


> А в чем проблема, хотя бы вкратце?


в попытке обращения к потоконебезопасным св-вам/методам VCL-объекта из дополнительного потока


 
icWasya ©   (2003-10-30 15:10) [6]

ну если сделал Show вместо ShowModal, то зачем огород городить??


 
Mystic ©   (2003-10-30 15:11) [7]

Работу потоков надо синхранизировать, в частности все обращения к методам VCL необходимо оборачитавть методом Syncronize.


 
ddenis   (2003-10-30 15:12) [8]


> зачем огород городить

Огород весь для того, чтобы задачи могли выполняться параллельно. А есть другие решения?


 
Mystic ©   (2003-10-30 15:15) [9]

Какие задачи? Пусть созданный тобою поток считает только задачу, а визуализацию оставь главному потоку.


 
ddenis   (2003-10-30 15:19) [10]


> Пусть созданный тобою поток считает только задачу, а визуализацию
> оставь главному потоку

Это вариант конечно. Еще вопрос: в моем листинге после Show идет такой кусок кода:

while not Terminated and not FItsTimeToClose do
sleep(100);

Он мне не нравится. Как можно "на лету" создать форму и открыть ее немодально? Ведь если в том листинге убрать этот while, то форма как создастся, так моментально и уничтожится. Как быть?


 
Smithson ©   (2003-10-30 15:23) [11]

Create - создать форму
Show - "окрыть" форму не модально. В чем проблема?
Только делать это следует из основного потока.
В нем же отследжавить - закончился связанный с данной формой процесс - Close её.


 
Digitman ©   (2003-10-30 15:29) [12]


> Он мне не нравится


он никому не может нравиться, не только тебе.
потому что ничерта полезного не делает.
как, впрочем, и вся поточная ф-ция у тебя ничего не делает.
зачем такой поток нужен ? непонятно)

код.поток нужен для выполнения каких-то длительных по времени расчетов, параллельно выполняемых с расчетами в других код.потоках... какие же расчеты ты делаешь в данном код.потоке ? поясни ...


 
ddenis   (2003-10-30 15:36) [13]

Ок, убедили. Спасибо всем.


 
panov ©   (2003-10-30 15:39) [14]

Он мне не нравится. Как можно "на лету" создать форму и открыть ее немодально? Ведь если в том листинге убрать этот while, то форма как создастся, так моментально и уничтожится. Как быть?

А ты попробуй-)

Не уничтожится форма.


 
ddenis   (2003-10-30 15:44) [15]

Еще как уничтожится...

with TMyForm.Create(Application) do
try
Show;
finally
Free;
end;


 
panov ©   (2003-10-30 15:46) [16]

>ddenis (30.10.03 15:44) [15]

А ты без Free для формы заверши поток и увидишь.


 
ddenis   (2003-10-30 16:00) [17]

Нет, сейчас уже речь не об отдельном потоке. Допустим, все выполняется в пределах основного потока, новых потоков не создается. Т.е. если убрать Free,

with TMyForm.Create(Application) do
try
Show;
finally
// Free;
end;

то форма не будет уничтожаться вообще, т.е. с течением времени будем иметь переполнение? Или куда она девается?


 
panov ©   (2003-10-30 16:07) [18]

if not Assigned(Form2) then
begin
Application.CreateForm(TForm2, Form2);
end;
Form2.Show;


 
ddenis   (2003-10-30 16:19) [19]

Было бы неплохо иметь неограниченное количество таких форм... хотя согласен, это можно решить списком или динамическим массивом... ок, спасибо.


 
Anatoly Podgoretsky ©   (2003-10-30 16:26) [20]

Форма уничтожится по окончанию долгоиграющей процедуры.


 
Digitman ©   (2003-10-30 16:27) [21]


> ddenis


> Было бы неплохо иметь неограниченное количество таких форм


любопытно, что тебя ограничивает ...
кроме, разумеется, ресурсов системы и емкости переменной типа Integer



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.046 c
3-41109
KA_
2003-10-23 09:06
2003.11.13
Проверка существования таблицы Interbase


6-41782
lamer1
2003-09-17 20:21
2003.11.13
На какой вкладке найти TServerSocket


3-40853
Vadim S
2003-10-21 12:56
2003.11.13
Транзакция MS SQL через ADO


1-41713
}|{yk
2003-11-03 11:18
2003.11.13
Как точно называется язык? Object Pascal или Delphi ?


3-40884
Митяй
2003-10-24 18:41
2003.11.13
Есть ли толковая замена PARADOX?