Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.032 c
1-41251
DimaK
2003-10-25 13:01
2003.11.13
Запись в файл


3-41049
inspirion
2003-10-24 12:57
2003.11.13
Помогите советом!


3-40813
Брат
2003-10-21 19:17
2003.11.13
SQL


3-40806
axx
2003-10-22 13:07
2003.11.13
Footers in DBGridEH


3-40925
kosm
2003-10-16 17:45
2003.11.13
BOLD for Delphi - миф или реальность?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский