Как перезапустить все программы

Я разрабатываю программу на C++, и было бы полезно использовать какую-то функцию, скрипт или что-то, что заставляет программу перезапускаться. Это большая программа, поэтому перезапуск всех переменных вручную займет у меня много времени.

Я не знаю, есть ли способ достичь этого или это возможно.

user5638477 13 окт ’16 в 13:37 2016-10-13 13:37
2016-10-13 13:37

10 ответов

Если вам действительно нужно перезапустить всю программу (то есть снова «закрыть» и «открыть»), «правильным» способом будет иметь отдельную программу с единственной целью перезапустить основную. AFAIK многие приложения с функцией автообновления работают таким образом. Поэтому, когда вам нужно перезапустить основную программу, вы просто вызываете «перезапуск» и выходите.

user1490355 13 окт ’16 в 13:43 2016-10-13 13:43
2016-10-13 13:43

Вы можете использовать цикл в вашем main функция:

int main() < while(!i_want_to_exit_now) < // code >>

Или, если вы действительно хотите перезапустить программу, запустите ее из жгута:

Быстрые советы для ПК | Как перезапустить графические драйверы

где 42 код возврата, означающий «перезагрузите, пожалуйста».

Тогда внутри программы ваш restart функция будет выглядеть так:

void restart()
user2456565 13 окт ’16 в 13:46 2016-10-13 13:46
2016-10-13 13:46

На Unicies или где-либо еще у вас есть execve и это работает, как указано на странице руководства, вы можете просто. убить меня за использование atoi потому что это вообще ужасно, за исключением такого рода случая.

#include #include #include int main (int argc, char** argv) < (void) argc; printf(«arg: %sn», argv[1]); int count = atoi(argv[1]); if ( getchar() == ‘y’ ) < ++count; char buf[20]; sprintf(buf, «%d», count); char* newargv[3]; newargv[0] = argv[0]; newargv[1] = buf; newargv[2] = NULL; execve(argv[0], newargv, NULL); >return count; >
$ ./res 1 arg: 1 y arg: 2 y arg: 3 y arg: 4 y arg: 5 y arg: 6 y arg: 7 n 7 | $

(7 был код возврата).

Он ни рекурсивно, ни явно не зацикливается — вместо этого он просто вызывает себя, заменяя свое собственное пространство памяти новой версией самого себя.

Таким образом, стек никогда не будет переполнен, хотя все предыдущие переменные будут переопределены, как и при любой повторной вызове — getchar вызов предотвращает 100% загрузку процессора.

В случае самообновляющегося двоичного файла, поскольку весь двоичный файл (по крайней мере, для Unix-подобных, я не знаю о Windows) будет скопирован в память во время выполнения, то, если файл изменяется на диске до execve(argv[0], . вызов, вместо этого будет запущен новый двоичный файл, найденный на диске, а не тот же самый старый.

user4532996 13 окт ’16 в 17:44 2016-10-13 17:44
2016-10-13 17:44

Это очень специфичный для ОС вопрос. В Windows вы можете использовать API перезапуска приложений или MFC Restart Manager. В Linux вы могли бы сделать exec()

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

КАК ПЕРЕЗАГРУЗИТЬ СВОИ ВНУТРЕННИЕ ПРОГРАММЫ | Закон Притяжения

user238419 13 окт ’16 в 16:30 2016-10-13 16:30
2016-10-13 16:30

Это звучит как неправильный подход, так как все ваше состояние является глобальным, и поэтому единственный четкий метод сброса всего (кроме ручного назначения значений «по умолчанию» для каждой переменной) — это перезапуск всей программы.

Читайте также:
Системные программы компьютера примеры

Вместо этого ваше состояние должно храниться в объектах (типа класса или чего-либо еще). Тогда вы можете создавать и уничтожать эти объекты в любое время. Каждый новый объект имеет новое состояние со значениями по умолчанию.

Не боритесь с C++; используй это!

user560648 14 окт ’16 в 11:46 2016-10-14 11:46
2016-10-14 11:46

Вам, вероятно, нужен цикл:

int main() < while (true) < //. Program. >>

Каждый раз, когда вам нужно перезагрузить, звоните continue; в цикле, и чтобы завершить вашу программу, используйте break; ,

user6525260 13 окт ’16 в 13:42 2016-10-13 13:42
2016-10-13 13:42

Когда я разрабатываю системы реального времени, мой подход обычно является «производным main()», где я пишу весь код, вызываемый из реального main(), что-то вроде:

Программа main.cpp:

int main (int argc, char *argv[]) < while (true) < if (programMain(argc, argv) == 1) break; >>

Программа main.cpp, где написан весь код:

int programMain(int argc, char *argv[]) < // Do whatever — the main logic goes here // When you need to restart the program, call return 0; // When you need to exit the program, call return 1; >

Таким образом, каждый раз, когда мы решаем выйти из программы, программа будет перезапущена.

Подробно: все переменные, глобалы и логика должны быть записаны внутри programMain() — ничего внутри «main()» кроме перезапуска управления.

Этот подход работает в системах Linux и Windows.

user2697571 14 окт ’16 в 13:18 2016-10-14 13:18
2016-10-14 13:18

Мне кажется, что вы задаете неправильный вопрос, потому что вы недостаточно знаете о кодировании, чтобы задать правильный вопрос.

Звучит так, будто вы спрашиваете, как написать некоторый код, при котором при пропущенном вызове он возвращается к исходному состоянию и перезапускает всю последовательность вызова / местоположения. В этом случае вам нужно использовать конечный автомат. Посмотрите, что это такое, и как написать. Это ключевая концепция программного обеспечения, и вы должны знать, если ваши учителя хорошо справляются со своей работой.

В качестве примечания: если вашей программе для инициализации всех ваших переменных требуется 5 секунд, то при перезапуске все равно потребуется 5 секунд. Вы не можете сократить это. Из этого должно быть ясно, что вы на самом деле не хотите убивать и перезапускать свою программу, потому что тогда вы получите именно то поведение, которое вам не нужно. С помощью конечного автомата вы можете иметь одно состояние инициализации для холодного запуска, когда система только что была включена, и второе состояние инициализации для горячего перезапуска.

Ох и 6 тем не очень много!:)

user5162810 14 окт ’16 в 13:41 2016-10-14 13:41
2016-10-14 13:41

В зависимости от того, что вы подразумеваете под «перезапуском» программы, я вижу несколько простых решений.

Одним из них является встраивание всей вашей программы в некоторый класс «Program», который, по сути, обеспечивает некоторый цикл, в котором есть ваша собственная программа. Когда вам нужно перезапустить программу, вы вызываете статический открытый метод «Restart», который снова запускает цикл.

Вы также можете попытаться сделать системный вызов, который снова запустит вашу программу и завершится. Как предлагается в другом ответе, вы можете создать программу-обертку для этой единственной цели (и проверить код возврата, чтобы узнать, выйти или перезапустить).

Читайте также:
Заставка программы где логика

Другой простой вариант заключается в использовании goto , Я знаю, что люди будут ненавидеть меня за то, что я даже упомянул это, но давайте посмотрим правде в глаза: мы хотим сделать простую программу, а не использовать красивый шаблон. Переход назад гарантирует уничтожение, так что вы можете создать программу с меткой в ​​начале и некоторой функцией «Перезапуск», которая просто возвращается в начало.

Какой бы вариант вы ни выбрали, хорошо документируйте его, чтобы другие (или вы в будущем) использовали меньше одного WTF.

PS. Как упомянуто Аленом, goto не будет уничтожать ни глобальные, ни статические объекты, то же самое будет и для окружающего класса. Поэтому любой подход, который не включает запуск новой программы вместо текущей, должен либо воздерживаться от использования глобальных / статических переменных, либо предпринимать надлежащие действия для их переустановки (хотя это может быть утомительным, как при добавлении каждой статической / глобальной)., вам нужно изменить процедуру перезапуска).

Источник: stackru.com

Windows 10 Нюансы автоматического перезапуска приложений в Windows 10

Если вы перезагрузите систему, не закрывая работающие приложения, то при следующем входе в учетную запись некоторые или даже все ранее запущенные приложения откроются автоматически.
Такой сценарий неизбежно порождает ряд вопросов, на которые я отвечу сегодня. Я уже пару раз поднимал эту тему в своем канале Telegram. Но поскольку в версии 20H1 фишка обрела законченный вид, я решил написать в блог.

Автоматический перезапуск приложений

  • 1709: включено и не отключается
  • 1803 – 1909: Параметры → Учетные данные → Варианты входа → Использовать мои данные для входа…
  • 20H1 и новее: Параметры → Учетные данные → Варианты входа → Перезапустить приложения
  • UWP – должны перезапускаться все. Например, у меня сработало с идущими в комплекте с ОС приложениями, а также с загруженным из магазина Unigram.
  • Desktop Bridge / MSIX — перезапуск не работает. В частности, не перезапустились TreeSize, CrystalDiskMark и Windows Terminal.

Автоматический перезапуск приложений

Также в дополнительных сведениях приложения внизу страницы указаны разрешения. Такая картина – признак Desktop Bridge.

Автоматический перезапуск приложений

Эти сведения берутся из манифеста приложения, который вы найдете в папке Program FilesWindowsApps. Картинке выше соответствует runFullTrust.

Встроенные Win32
Перезапуск работает у большинства приложений. У меня он не сработал для PowerShell, cmd, а также оснасток MMC (диспетчер устройств, журнал событий), хотя сам процесс mmc.exe запускался.
Учтите, что если в предыдущем сеансе программа была запущена от имени администратора, она перезапускается с обычными правами.
Сторонние Win32
Разработчик приложения должен зарегистрировать его в системе для автоматического перезапуска. Например, зарегистрированы браузеры Chrome и Firefox, приложения Microsoft Office и т.п. Регистрацию можно форсировать, что я покажу ниже.
Условия для перезапуска
Автоматический перезапуск привязан к событию входа в систему, нежели к перезагрузке. Об этом, кстати, сказано в описании АПП в параметрах.

Другими словами, функция работает в сценарии «выход из системы → вход в систему». Перезагрузка ОС между этими событиями не играет роли.

Приложение может не перезапуститься, если системе не удалось корректно завершить его. Например, выполняется перезагрузка, а у программы есть несохраненные файлы, и она сигнализирует об этом. Вам предлагается отменить перезагрузку или форсировать ее.
Если форсировать или подождать завершения процессов по таймауту, такое приложение может не перезапуститься. Если же отменить перезагрузку, вернуться в систему и корректно закрыть проблемное приложение, то после перезагрузки не восстановятся другие ранее запущенные программы. Ведь система успела их закрыть, и они уже не были запущены при следующем завершении сеанса.
Наконец, есть еще одно мелкое объективное ограничение – невозможность полностью восстановить состояние приложения. Например, Word запустится с ранее открытыми документами, но не окном настроек, если оно было открыто до перезагрузки.
Как форсировать автоматический перезапуск приложения
Регистрация для перезапуска реализована в параметрах совместимости приложения. Встроенные приложения по определению должны быть совместимы с ОС, и этих настроек у них нет. Зато они есть у всех сторонних программ, в т.ч. созданных Microsoft.
В свойствах исполняемого файла или ярлыка перейдите на вкладку Совместимость и установите флажок Зарегистрируйте эту программу для перезагрузки.

Читайте также:
Программа чтобы разархивировать rar

Автоматический перезапуск приложений

Затем перезапустите приложение, чтобы настройка совместимости вступила в силу. Я перепробовал пяток разных приложений и неудачной была лишь попытка с Fiddler.
Это не работает для магазинных приложений Desktop Bridge / MSIX. Они представляют собой упакованные Win32, поэтому в папке есть привычный исполняемый файл, пусть и не запускающий приложение двойным щелчком.

Автоматический перезапуск приложений

  1. ОС перезагружается, появляется экран входа.
  2. Система выполняет вход от вашего имени и тут же блокирует сеанс.
  3. Запущенные до перезагрузки приложения начинают стартовать.
1 dir C:windowsprefetch | sort LastWriteTime
  1. ОС перезагружается, появляется экран входа.
  2. Система ждет вашего входа.
  3. Запущенные до перезагрузки приложения начинают стартовать.
  1. ОС перезагружается, появляется экран входа.
  2. Система выполняет вход от вашего имени и тут же блокирует сеанс.
  3. Система выполняет оптимизацию после установки обновлений. TiWorker, Runtime Optimization Service (.NET), реагирующий на новые файлы антивирус – вот это все.
  1. Обновления загружаются в фоне.
  2. Перезагрузка выполняется вне периода активности.
  3. Система выполняет оптимизацию, приложения перезапускаются.
  4. Пользователь входит в систему, ничего не замечая.

Источник: www.safezone.cc

Автоматический перезапуск приложений Windows в случае сбоя

При работе за компьютером пользователям приходиться запускать самые разные приложения, в том числе носящие статус критических, бесперебойное функционирование которых крайне важно для выполнения приоритетных задач. Чтобы обеспечить гарантированную работу подобного рода программных решений в окружении Windows, имеет смысл взять на вооружение бесплатную утилиту Restarter, осуществляющую мониторинг заданных процессов и автоматический перезапуск оных в случае непредвиденного сбоя. Приложение умеет не только перезагружать «зависшие» программы и вести соответствующий лог выполненных действий, но и информировать администратора системы с помощью звукового сигнала либо посредством запуска внешнего сценария, отправляющего email-оповещение на указанный адрес. Restarter не требует инсталляции, занимает на диске всего 210 кбайт и работает в любых редакциях ОС Microsoft на базе ядра NT, начиная с Windows 2000. Для корректной работы инструмента необходим установленный в системе компонент . NET Framework версии 2.0 или выше.

Автоматический перезапуск приложений Windows в случае сбоя

Материалы по теме:

  • Установка системных служб в Windows;
  • Диагностика и устранение возникающих при работе с ПО Microsoft проблем;
  • Сокрытие запущенных в Windows приложений.

Предыдущая статья Как защитить запуск Google Chrome паролем

Источник: software-expert.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru