Как физически удалить процесс, созданный по Новый ComОбъект()? #394259


#0 by Гений 1С
Т.е. если я просто пишу ДЛя Инд = 1 по 10 Цикл Объект = Новый COmОбъект("InternetExplorer.Application"); ... То память после каждого прогона не очищается. Кроме того, используестя тольо один объект в диспетчере задач, а не несколько, и память накапливается в нем. Можно как-то физически убить процесс, связанный с Объект?
#1 by H A D G E H O G s
Как вариант - влзьми Нетленку addin.processes ТаблицаПроцессов Получи слепок процессов до Объект = Новый COmОбъект("InternetExplorer.Application"); Получи слепок процессов после. Разница - процессы, созданные твоей командой (почти навеняка, филтруй по имени файла на вся случай), храни их PID-ы в 1С ке. Потом убивай, когда надо через ЗавершитьПроцесс Вообще найди Смахабра, он наверняка лучше скажет.
#2 by H A D G E H O G s
С праздником тебя.
#3 by Гений 1С
Там кстати есть HWND у интернет Эксплорера, никак не заюзать? ПНХ
#4 by H A D G E H O G s
а. Можно, но в Нетленке этого нет. Могу быстро набросать, ежели невтерпеж. б. СПНХ.
#5 by H A D G E H O G s
Вообще давай всё озвучь, что тебе надо, я те сразу набросаю. Денег не надо, все таки праздник.
#6 by Гений 1С
Сделай обертку или научи меня как для icq.dll от миранды. ;-)
#7 by Гений 1С
Вот не решенные вопросы по IE: Собственно, возник ряд вопросов по работе с IE в OLE-режиме. 1. Вот такой простой код: [/SRC] В Висте открывает list.ru в новом окне, а не в созданном, пишет т.к. узлы, относящиеся к разным зонам безопасности должны открываться в разных окнах. 2. Как минимизировать (свернуть) окно браузера. 3. Можно ли через переменную IE убить процесс напрочь, т.к. если я пишу IE = 0, он все равно остается в памяти, а если повторяю создание IE в цикле, то новые оле объекты присоединяются все время к одному процессу iexplorer в диспетчере задач. Дело в том, что в IE происходит утечка памяти и я хочу через каждые 100 Navigate убивать процесс IE физически, но не получается. 4. Когда я вызываю метод submit формы, сразу ли изменяется readystate браузера? А то есть подозрение, что он меняется не сразу и я не могу отловить, когда станица загружена, т.е. я вижу что он 4 сразу после submit и считаю, что submit обработал. Есть ли у страницы уникальный дескриптор, который меняется после загрузки? 5. Как определить по объектной модели, что пользователь закрыл браузер, ведь переменная IE от этого не обнуляется? 6. Если в браузере висит окно сообщения "Страница пытается закрыть окно ок/отмена?", то даже вызывая метод браузера IE.Quit, я не могу закрыть окно, раздается звуковой сигнал и не более того.
#8 by Господин ПЖ
(3-4) Высокие, высокие отношения...
#9 by FanatToNight
IE=""; ничего в памяти нету..проверено много раз.. (вру, точнее - 5раз толечки. зы. только я XBase открываю.. и закрываю. :)
#10 by Гений 1С
чем IE = "" лучше моего IE =0
#11 by FanatToNight
0 это символ.
#12 by FanatToNight
да ничем, вроде..
#13 by Torquader
Когда вы делаете IE=0, то теряется OLE-связь с сервером Internet Explorer - последнему система через несколько секунд присылает сообщение, что ему "пора на покой", но, если у него открыто окно (Visible=true), то на покой уходит только OLE-сервер, а окно и программа остаются. Все IE создаются в памяти одного процесса и одного сервера. Поэтому, если не отключить хотя бы один объект, то всё остаётся в памяти. 1. Если vista так делает, то вопросы к создателям vista (собственно, насколько я понимаю, в этом-то утечка памяти и состоит, что создаются окна, которые теряются). Можно запоминать HTML-окна, и если он поменялся, то прошлое окно надо сделать активным и послать ему ALT+F4 (через SendKeys). 2. Найти окно и послать ему WM_COMMAND с префиксом MINIMIZE (в висте посылка сообщений от другого процесса не проходит). 3. Переменная никак не связана с сервером (тем более Out-Process сервером, обмен с которым идёт через маршалинг WM_COPYDATA между процессами). При удалении переменной система уменьшает счётчик ссылок на объект и когда он становится равным 0 предпринимается попытка удаления объекта. Насколько я помню, у открытого окна IE получается внутренняя ссылка (он сам себя как сервре рассматривает). 4. ReadyState изменяется после выполнения метода submit, когда начинает загружаться страница (если выбрать метод mailto, то оно вообще не изменится). Хотя, лучше использовать метод Busy - он показывает, что браузер занят. Уникального ID у страницы нету, но можно заглянуть внутрь страницы (document.innerHTML и определить размер документа). 5. Если пользователь закрыл браузер, то при вызове любого метода объекта происходит ошибка, так как маршалинг до сервера не проходит. у меня получалось ловить через try-endtry (1C7.7), On Error Goto (Excel) и try-catch (JavaScript). 6. Когда в браузере висит окно, то он не отвечает на события - надо определять, что окно висит (например, через Busy) и просто закрывать окно через SendKeys. Если работать через JavaScript и подключать обработчики событий, то окно вообще блокирует скрипт.
#14 by Cap_1977
Как же мало вы знаете ((((((((( нда ююю V7 и V8 это конструктор с интерпретатором. Команда IE=0 (или IE="") интерпретируется как вызов деструктора для _объекта_ _переменной_ IE. Но, т.к. объект в системе создается в куче (стеке) через вызов HeapAlloc (HeapFree) то при активном (существующем, а не Visible=true - т.е. показанном) окне Internet Explorer (а особенно если окно обрабатывает цикл сообщений (болтается какой нить вопрос пользвателю) окну посылается сообщение DestroyWindow, а затем TerminateProcess ("пора на покой"). Так вот если окно не ответило на это сообщение, а 1С уже закрылась то по соглашению stdcall винда _не очищает_ стек. Врезультате имеем процесс болтаюийся в памяти, закрытую 1С и утечку памяти. Вывод: 1. Виста так _не делает_. Послать можно и WM_CLOSE. 2. муйня. Минимизе не уничтожает окно. 3. "маршалинг WM_COPYDATA между процессами" проиворечишь сам себе в п.2 То что в скобках. 4,5,6 - я конечно профан и нахватался по верхам. а на чом вы пишете ?
#15 by H A D G E H O G s
Пункт 1 - мдать. Деструкторы, конструкторы. RTFM!!! Ключевые слова самого Гения :<< а если повторяю создание IE в цикле, то новые оле объекты присоединяются все время к одному процессу iexplorer в диспетчере задач.>> Долго думать над ними. Пункт 2 - Гений 1Са не хочет убивать окно. Кто это сказал? Гений просто увидел интересный эффект (предполагаю) и хочет его использовать. Откройте 1С, гляньте на его процесс в диспетчере, потом минимизируйте окно и снова гляньте. А если результат неодинаков - зачем платить больше :-). Только глупость это. Как мало вы знаете :-(
#16 by Гений 1С
Короче наговорили всякой муйни. Буду пробовать рассылать сообщения типа WM_CLOSE, знаю как это делается через объектную модель. Через SendKeys не знаю, надо же найти окно, которому посылать, у браузера есть HWND, в принципе, но идея ничего...
#17 by H A D G E H O G s
Зачем тебе окно минимизировать?
#18 by dk
имхо достаточно создавать объекты через vbs, тогда создаются отдельные процессы. хотя на iexplore не проверял, но с ехелем помогает
#19 by Гений 1С
а почему в таком случае создаются отдельные процессы?
#20 by Гений 1С
Попал пальцем в небо - с Экселем отдельные процессы и так создаются по одному на Эксель.Аппликатион. А для ИЕ в Висте, по крайней мере, всегда один
#21 by Гений 1С
Один для всех оле-серверов, с пустой командной строкой
#22 by dk
а проверить? в 7-ке все к одному цепляются
#23 by H A D G E H O G s
Специально для Гениев и прочих конструкторов/деструкторов
#24 by dk
не, проверил, создается 1 процесс
#25 by H A D G E H O G s
Специально для Гения: Вот тебе новая Нетленка: файлообменник номер файла: 0118527. Вот тебе код:
#26 by Гений 1С
спасибо, если по другому никак не получится, заюзаю ВК. Наверное можно через скрипты пришибить как-то
#27 by H A D G E H O G s
То-то же, Марья Ивановна, то-то же © Ералаш.
#28 by Гений 1С
Добавь в нетленку поддержку сокетов
Тэги:
Ответить:
Комментарии доступны только авторизированным пользователям

В этой группе 1С