Текущий архив: 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.49 MB
Время: 0.032 c