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

Вниз

Многопроцессное MDI приложение   Найти похожие ветки 

 
Unknown_user   (2010-08-19 14:35) [0]

Как создать MDI приложение, в котором каждое дочернее окно - это отдельный выполняющийся процесс?

Так сделано в Google Chrome http://blog.chromium.org/2008/09/multi-process-architecture.html

А вот я нашел описание http://www.codeproject.com/KB/miscctrl/AppControl.aspx.

Кто-то занимался подобным?


 
Игорь Шевченко ©   (2010-08-19 14:49) [1]

в гугль хром - не MDI


 
12 ©   (2010-08-19 15:53) [2]

кто-то подавал идею - запускать несколько процессов, драть их и натягивать на MDI окна


 
DVM ©   (2010-08-19 16:13) [3]


> 12 ©   (19.08.10 15:53) [2]


> драть их

чего делать?


 
Unknown_user   (2010-08-19 23:16) [4]

>кто-то подавал идею - запускать несколько процессов, драть их и натягивать на
MDI окна

можно подробнее?

>в гугль хром - не MDI

мне хоть бы так. переключение между процессами при помощи табов.


 
DVM ©   (2010-08-20 00:10) [5]


> Unknown_user   (19.08.10 23:16) [4]

Все довольно несложно, просто окна разных процессов либо позиционируются в нужные места главного хост окна или делаются его дочерними. Первый запущенный процесс - становится главным, владеющим хост окном.


 
12 ©   (2010-08-20 08:37) [6]

ну т.е., запускается окно-процесс и не показывается, а вывод его направляется на вновь созданного чилда, соответственно ввод с чилда направляется в соответствующий процесс.

не помню, идею только помню. Такая примерно


 
han_malign   (2010-08-20 09:13) [7]

ActiveX - inproc "документ" маршалить в outproc хост который распихает их по контейнерам...


 
Unknown_user   (2010-08-20 13:07) [8]

Интересно кто-то создавал что-то подобное в Delphi? Идея интересная. Взаимодействие между процессами легко организовать при помощи COM. А пригодиться такой подход может в любом приложении, работающий со многими однотипными документами. Если документы потребляют много ресурсов процессора и памяти, то разнести их выполнение в разные процессы - хорошая идея. Кроме того повышается стабильность приложения. Сбой в дочернем процессе не вызовет падения всего приложения.


 
DVM ©   (2010-08-20 13:10) [9]


> Сбой в дочернем процессе не вызовет падения всего приложения.

зато сбой в основном вызовет


 
Unknown_user   (2010-08-20 13:12) [10]

>зато сбой в основном вызовет

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


 
Unknown_user   (2010-08-22 15:58) [11]

Подскажите, все никак не могу сообразить как реализовать следующее.

Есть EXE в котором выполняется обработка командной строки. Если в командной строке встречается специальный параметр, например -сhild, то главная форма не создается, создается только специальное дочернее окно. Создание процесса с параметром -child происходит из основного процесса. После создания дочернего процесса, создается MDI окно, в которое вписывается при помощи SetParent окно дочернего процесса.

Коммуникацию между основным и дочерними процессами предполагается организовать через COM. Но какой COM механизм использовать в данном случае? В основном процессе нужно собрать список всех TProject, которые рисуются в дочерних окнах. Объект класса TProject создается в дочернем процессе. Далее каким-то образом надо его представить в основном процессе.

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

ActiveX объект запускается в вызывающем процессе. И тоже непонятно как его применить в данном случае.

Знатоки COM. подскажите. пожалуйста.


 
tesseract ©   (2010-08-23 18:17) [12]


> Знатоки COM. подскажите. пожалуйста.


Отделять рабочие процессы от Гуя, как завещали великие.


 
Unknown_user   (2010-08-23 18:54) [13]

>Отделять рабочие процессы от Гуя, как завещали великие.

спасибо, а конкретнее?


 
tesseract ©   (2010-08-23 19:21) [14]


> спасибо, а конкретнее?


Окна делаются в главном процессе, а обработка данных идёт параллельно в пуле потоков. Если идёт обработка асинхронных данных - аппаратура там или  
tcp/ip.
Com объекты создаются в потоках абсолютно нормально, чего не скажешь об ActiveX.


 
Unknown_user   (2010-08-24 14:05) [15]

В общих чертах реализовал. Если кому-то интересно, выложу исходники.

Получилось MDI приложение, где каждое дочернее окно является хостом для дочернего процесса. Коммуникация между основным процессом основана на COM. Доступ к объекту дочернего процесса из основного через интерфейсный объект. Реализовал события. Клик по окну дочернего процесса генерит событие в основном процессе.

Можно писать свой Google Chrome :)

Осталась, однако, одна проблема. При клике по окну дочернего процесса, этот процесс забирает фокус на себя. Главное окно основного процессе стает неактивным. Как запретить Windows убирать фокус с приложения, при клике по окну другого приложения?


 
nobody   (2010-08-25 13:11) [16]


> Если кому-то интересно, выложу исходники.


выложи, плиз, на какую-то шару


 
Unknown_user   (2010-08-27 13:52) [17]

Выкладываю http://www.geosystema.net/MDIMulriProces.zip

В приложении каждое дочернее окно является хостом для отдельного процесса. В каждом дочернем процессе создается COM объект Child, доступ к которому получаем в основном процессе. Также реализована обработка событий, возникающих в дочернем процессе. Клик по окну дочернего процесса обрабатывается в основном процессе.

Пункт меню DrawCircle рисует кружки в активном окне. Рисование полностью вынесено в дочерний процесс.

Получили стабильное приложение. Сбой в дочернем процессе не опасен для основного процесса. Попробуйте нажать на кнопку Crush process в дочерней форме. Это вызовет рекурсивный вызов процедуры в дочернем процессе и в итоге переполнение стека и исключение. Если нажать на эту кнопку несколько раз, то Windows не выдержит такого издевательства над стеком программы и убьет наш дочерний процесс. Теперь при нажатии на DrawCircle программа сообщит о проблемах с дочерним окном.

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

Наблюдать дочерние процессы удобно из программы ProcessExplorer. Она покажет, что родителем основного процесса является файловый менеджер, из которого вы его запустили. А родителем дочернего процесса является сервис DCOM launch (svchost.exe), запускающий COM сервера. Можете попробовать убить дочерний процесс отсюда.

При первом запуске приложение регистрирует COM сервер в реестре. Для этого требуются права администратора и благословление антивируса.

Клик по дочерней форме вызывает событие дочернего процесса OnMouseClick, которое обрабатывается в основном процессе.



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

Форум: "Прочее";
Текущий архив: 2010.12.05;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.003 c
15-1282681785
Юрий
2010-08-25 00:29
2010.12.05
С днем рождения ! 25 августа 2010 среда


2-1284382841
Delphi
2010-09-13 17:00
2010.12.05
Приведение типов в методах TAction


15-1283121955
George
2010-08-30 02:45
2010.12.05
Путь к БД - захардкодить или как?


15-1283231904
12
2010-08-31 09:18
2010.12.05
Как заставить delphi 7 при старте на весь экран быть?


2-1284283391
mfender
2010-09-12 13:23
2010.12.05
Проблема с property в наследнике





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский