2012-05-10 6 views
4

У меня есть большое приложение с большим количеством потоков и множеством сложных статических объектов. В настоящее время, когда пользователь выходит из системы, приложение перезапускается, чтобы принудительно сбросить приложение в исходное состояние.Как сбросить процесс Windows в предыдущее состояние?

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

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

Мне нужен способ (однако грязный), чтобы сбросить этот процесс в исходное состояние, не перезапустив процесс. Предоставляет ли winapi все, что может сделать это для меня?

+0

Как создать новый пул приложений при сбросе и все объекты там? – kenny

+0

Если я понимаю, что вы предлагаете, новости приложения __a lot__ объектов, не сохраняя указателей на них в любом месте. Они предназначены для того, чтобы просто всплывать в памяти и делать свое дело, пока приложение не закроется. Я не уверен, что это очень возможно. –

+0

EDIT: К сожалению, я имел в виду Application Domain not pool ... Убивание домена приложения очень похоже на выход приложения. Не уверен, что это поможет вам. У этого есть собственная память «защищенная» память, почти полный процесс, но нет. ;) – kenny

ответ

3

Нет ничего, что помешало бы службе Windows выполнить эту работу в отдельном процессе, хотя, по общему признанию, это немного грязно. Поэтому я бы предположил, что у вас есть два exectuables: родительский процесс, реализованный как служба, и дочерний процесс, который может выйти (и будет перезапущен родителем), когда вам нужно сбросить состояние приложения.

2

Windows не поможет вам здесь. Вам придется решить проблему в своем собственном коде, а не искать серебряную пулю. Вы говорите, что

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

Вам придется пересмотреть это, поскольку это ваш единственный вариант.

0

Без повторной записи everthing (что вам нужно сделать) вы можете просто переместить всю свою текущую логику в рабочий поток, тогда служба может порождать, прерывать и повторно запускать эту нить всякий раз, когда это необходимо. Сам процесс обслуживания будет работать.

+2

Сильно прекратить нить должна считаться оружием абсолютного крайнего запаса. –

+0

Если я чего-то не упускаю, я не верю, что Windows может порождать поток, который действует как процесс, не так ли? Он должен иметь собственные ресурсы памяти и системы. –

+0

Я думаю, вы оба пропустили то, что я пытался сделать. Переместите текущую логику в новый сервисный сервис, но все, что было в основном потоке * текущего * приложения, теперь будет его собственным рабочим threa d в сервисе.Когда поток начинается, он выделяет/инициализирует то, что ему нужно. Когда он останавливается, он освобождает/освобождает все, что ему нужно. Затем служба может запускать новый экземпляр этого потока, когда он обнаруживает логин, и ** изящно ** останавливает этот поток, когда он обнаруживает выход из системы. Никакой принудительной остановки, никакого отдельного процесса. –

Смежные вопросы