Форум: "Прочее";
Текущий архив: 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