Вниз
Скачать: CL | DM;

создание в delphi mdichild окон в отдельном потоке   Найти похожие ветки 

← →
Mim   (2004-03-06 23:51) [0]

Ни кто не реализовывал в
delphi возможность создания в delphi
mdichild окон в отдельном (не основоном
потоке)?

Я как понимаю проблемма здесь в том что
мы не можем обращаться из разных потоков
к одному vcl"ному или clx"ному обьекту
коеми являются application, screen и
mainform с которыми работает mdichild
окошко.

Как бы это обойти?


← →
Digitman ©   (2004-03-07 11:37) [1]


> возможность создания в delphi
> mdichild окон в отдельном (не основоном
> потоке)?


зачем ?
только не говори что будет якобы быстрей все работать или "тормозить" что-то там перестанет

доп.поток нужен для выполнения длительных вычислений параллельно с вычислениями в осн.потоке, которые как правило сводятся с вычислениями, связанными с обработкой сообщений/событий польз.интерфейса


← →
Mim   (2004-03-07 21:12) [2]

Digitman ©   (07.03.04 11:37) [1]

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

К стати мелкософт же сделала так что каждое окно роводника запускается в отдельном потоке, мне кажется что это наиболее врное решение.


← →
Zacho ©   (2004-03-07 21:33) [3]


> К стати мелкософт же сделала так что каждое окно роводника

Не в потоке, а в процессе. Хотя могу и ошибаться, специально не проверял.


← →
Mim   (2004-03-08 08:49) [4]

Zacho ©   (07.03.04 21:33) [3]

Действительно ошибаетесь по умолчанию для каждого окна создается отдельный поток, о чем говорит не несколько а одна explorer.exe в списке задач, хотя в XP есть галочка "запускать проводники в отдельном пероцессе".

Давайте всеже вернемся к основоному вопросу.


← →
TUser ©   (2004-03-08 09:04) [5]


> мы не можем обращаться из разных потоков
> к одному vcl"ному или clx"ному обьекту

Надо использовать synchronize, хотя честно говоря, я не очень понял в чем состоит твоя проблема.


← →
Cobalt ©   (2004-03-08 10:13) [6]

>TUser ©   (08.03.04 09:04) [5]
>Надо использовать synchronize

Тогда лучше в основном потоке не использовать самому всякие способы синхронизации(мьютексы, там или эвентсы). А то основной поток будет ждать, а ему попробуют сделать synchronize тот, кто захватил мьютекс. И будет мертвая блокировка.


← →
Плохиш   (2004-03-08 10:47) [7]

>Mim   (08.03.04 08:49) [4]

Вообще-то Микрософт использует SDI


← →
Mim   (2004-03-08 10:58) [8]

TUser ©   (08.03.04 09:04) [5]
Cobalt ©   (08.03.04 10:13) [6]
Во втором абзаце небыло знака вопроса, зачем же вы отвечаете то что я и так знаю :)

Плохиш   (08.03.04 10:47) [7]
Просто mdiparent"ом это формы является desktop. Готов с вами поспорить на эту тему в отдельной ветке (если вы несогласны).

Давайте всеже вернемся к основоному вопросу.


← →
Mim   (2004-03-08 11:06) [9]

Вообщем уточняю вопрос
Как сделать чтобы в каждом потоке была своя очередь сообщений
while getmessage(...) do
 begin
   processmessage(...);
   dispatchmessage(...);
 end;

работающая только с этим окном

Как я понимаю такое невозможно, или нет?


← →
Erik ©   (2004-03-08 13:37) [10]

Почему невозможно? Все будет работать даже есть спецальная функция которая ждет события или сообщения. MsgWaitForMultipleObject и пр...

Это просто цикл обработки сообщений в потоке.
while PeekMessage(Msg, 0, 0, 0, pm_Remove) do
begin
 if Msg.Message = wm_Quit then
    Halt(Msg.WParam);
 TranslateMessage(Msg);
 DispatchMessage(Msg);
end;


← →
Mim   (2004-03-08 20:00) [11]

Erik ©   (08.03.04 13:37) [10]

Почему невозможно? Все будет работать даже есть спецальная функция которая ждет события или сообщения. MsgWaitForMultipleObject и пр...

MsgWaitForMultipleObject работает не с сообщениями. Это один из инструментов межпоточной синхранизации, как я уже говорил, второй абзац, без знака вопроса.

Что касается вашего кода то вы повторили мой небольшим измением :)
Думается что ваш код будет грузить процессор под 100%

чтоже касается завести в каждом потоке цикл обработи сообщений то таких проблемм нет, нужно завести в кадом потоке свой обьект application который будет вращать этот цикл внутри apllication.run. Как я понимаю это не реализуемо поскольку тогда перестанет функционировать mdi основа приложения.

Предлагаю тему на этом закрыть :)



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

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



Память: 0.48 MB
Время: 0.021 c
4-1073549985
lex
2004-01-08 11:19
2004.03.28
Как на время работы программы заблокировать автозапуск CD?


14-1078045315
Verg
2004-02-29 12:01
2004.03.28
Юбилей - миллион...


11-1057509228
=Sniper=
2003-07-06 20:33
2004.03.28
Поскажите замену для KOLследующим выражениям!!!!


14-1077808465
Mentov
2004-02-26 18:14
2004.03.28
Шифрование


7-1073639480
Juliet
2004-01-09 12:11
2004.03.28
Лоток принтера




   Наверх