Допустим, есть некий модуль, с расширением dll. В котором есть одна единственная экспортируемая функция, которая стартует поток с ООП абстракцией. Вопрос в следующем - если в этой абстракции возникло исключение, как его можно скипнуть, прочистить родительский процесс от этого модуля. Грубо говоря, если в dll рождается что-то попадающееся на обработчик, установленный через AddVectorExceptionHandler, то выгрузить из процесса ЭТОТ модуль (dll), и начать заново. Что кроме кучи еще нужно предосмотреть?
эмм... как бы любые открытые ресурсы нужно закрыть... модуль может создать/открыть файл, секцию, мьютекс, окна и тд и тп...
По-моему изящней будет запускать отдельный процесс, загружающий эту длл, и синхронизироваться с ним через пайпы. А в случае чего сносить весь процесс. Разом решает все проблемы.
Вех не из данной длл решит проблему исключений, тк это будет Ловушка для всех исключений процесса. по срабатыванию из адресного пространства длл- вынос библиотеки. Выгрузить не проблема.но чо там вам ооп загрузит каких куч, и шобы вам не терять память на каждой длл, лучше вообще ознакомиться с тем, чо делает длл лично. Если правильно вас понял я --- Сообщение объединено, 17 авг 2019 --- консоль есчо запустите, линупсомышление ёп --- Сообщение объединено, 17 авг 2019 --- Ой, наверное проще всё. Вы ловите на вех исключение, в обработчике уточняете адресное пространство в котором оное произошло, если оное есть длл, то выгружаете её, а в длл на коллбэке детач (знаете, наверное про калбэки в длл? С них код библиотек обычно и начинают) освобождаете всё чо было занято данным модулем
Как раз для этого проще создать отдельный процесс, все хендлы будут гарантированно закрыты, утечек памяти и любых других сюрпризов не будет. А изобретая велосипед можно надолго в это закопаться (без нужды) и в итоге работать только на ХР например будет Если это линуксомышление (хз как они мыслят на самом деле), то хрен с ним пусть будет так называться, зато быстро и с гарантированным результатом.
вех и коллбэки в длл работать будут везде. велосипед (пртом канадский (с квадратными колёсами) изобретаете вы с процессами и пайпами(пздц же вощще)). есть конешн вброс по поводу того, что библиотека с функцией не принадлежит организатору темы и править код он так просто не может. Тогда сложнее и придёццо искать таки ему подводные камни
соприкосновение с таким мышлением ведёт к безумию потребителей вЫнЬдЫ кстати, не совсем ясно, что значит "начать заново".. 1. продолжить работу проги уже без ЭТОГО модуля? 2. перезапустить весь процесс?
я чо тут шоле? бро, да мне насрать как он это решит, но мы с тобой решать этого друг с другом не должны, я прав?
Просто чтоб поржать открыл диспетчер задач и увидел 21 процесс opera.exe. Почуяв неладное запустил ишака и вижу по одной копии iexplore.exe на каждую открытую вкладку. Утирая пот ушанкой запускаю хром, а там 11 процессов при запуске, усыхающие до 7 штук через несколько секунд. Линуксомыслящие уже среди нас!
f13nd, это печально на самом деле. Просто сейчас такое время, что память можно не экономить, и создавать процесс хоть на каждый edit. Но, я вот 2 года сидел за древними компами (ну как древними - 10 летней давности, 2гб памяти), и там тот же хром на 10 вкладках вешает систему наглухо (по крайней мере, ничего кроме браузера уже не запустишь). В винде немного другая история, как учит нас Рихтер, процесс отъедает много памяти, гораздо больше потока (и потоки то надо юзать реже, есть фиберы и прочие легковесные заменители). Но..всем , как обычно, пофиг.
Выгрузить модуль освободить занятые им ресурсы,и загрузить его снова отправив в работу.Попросту говоря ищу безопасный перезапуска, некоего обьекта в памяти процесса при исключении.
есть исходники модуля? если да, то модуль технически должен сам контролировать все ресурсы, в случае исключения их освобождать (в DLL_PROCESS_DETACH или в обработчике исключений - не важно)...
Я почти уверен, что в браузерах эта мера именно из-за высокой вероятности утечек памяти и хендлов и введена. Многократно сталкивался с тем, что поток не может нормально завершиться и крашит весь процесс где-то при освобождении ресурсов (приходилось GetCurrentThread+TerminateThread на выходе делать). В некоторых ком-компонентах даже при своевременном освобождении всех объектов память куда-то утекает (особенно прекрасен в этом плане MS SQL Server через odbc, им просто невозможно переработать базу в несколько гигабайт за одну сессию). В этих условиях вполне разумно разделять задачи на разные процессы, время от времени пересоздавая их.
если есть исходники модуля, то все нужные операции по высвобождению ресурсов вполне можешь прописать в обработчике прерывания. Если сорцов нет, то вариант f13nd самый лучший в плане отсутствия лишних заморок. Ты, пожалуйста, не сравнивай старый инет с современным == тогда бравзер от силы гифки обрабатывал, а теперь бравзер -- еть страшОннЫй мультимедия комбайн и, кстати, весят дико в основном не процессы самого хромого, а подгружаемый контент + наличие аддонов тожЪ увеличивает вес да тормознутость его процессов, а без аддонов опять же плохо что касательно "процесс против пАтока", ты никогда не сделаешь прогу на потоках такой стабильной и безопасной акь на процессах.
в хроме и других браузерах это сделанно из соображений безопасности, типа изоляций вкладок друг от друга, как-будто запуска в лоуинтегрити было недостаточно... но как бы пора бы уже перестать жить прошлым, в современных реалиях 10 процессов на одно приложение - это норма, все равно будет работать быстрее, чем один процесс джавы например))... --- Сообщение объединено, 19 авг 2019 --- хорошо легковесные процессы реализованы в BEAM (виртуальная машина Erlang'а), вот там их можно хоть миллионами плодить и прибивать, при этом все работает достаточно быстро... канеш физически это реализовано через потоки операционной ссистемы и асинхронную обработку сообщений, отсылаемых между процессами виртуальной машины... сверху работает планировщик, который при необходимости создает такое минимальное количество потоков операционной системы, какое нужно для нормальной обработки всех сообщений... при этом задействуются ядра процессора... как бы мне очень хотелось бы посмотреть, как бы выглядили современные операционные системы, если бы такие процессы были реализованы на уровне системы, а не программно... все бы программировали драйверы и прикладное ПО в совсем другой парадигме...
Однако ж, справедливости ради стоит отметить, что в таких описаниях имеются явные спекуляции == асинх. сообщения - еть всё же форма шаровой памяти, просто размер мессаг фиксированный и обмен может происходить по наиболее быстрым путям. Но всё резко меняется, когда проц. должен координировать работу разных железок с различными протоколами управления и тогда обходиться короткими мессагами не получится. chrome://flags всяк страждущий может прекратить сие "безобразие", однако будут возникать проблемы с капризными аддончиками, да и на сайтах сюрпризы могут оказаться
каждыя жаба свой эрланг хвалит. а все почему? потому что каждый эрланг хвалит свою жабу. а всё почему? потому что гладиолус и есчо потомучто, почему бы и нет. лучше уж о этом думать, чем устремлять взгляды в бесконечные споры