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

Вниз

Многопроцессное 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.009 c
6-1230204686
Calligraff
2008-12-25 14:31
2010.12.05
Организация события OndblClick для TPageControl


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


2-1284533006
Nurjanov
2010-09-15 10:43
2010.12.05
Отчет в Excel по шаблону


15-1282887776
менеджер какого-то звена
2010-08-27 09:42
2010.12.05
Ёксель


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