Как я гарантирую быстрое завершение работы своего win32 приложения?

Необходимо перейти в настройки YouTube> Диспетчер видео> нажмите «Редактировать видео»> «Дополнительные настройки»> «Параметры дистрибутива»> «Разрешить внедрение»

7
задан Mateen Ulhaq 15 May 2011 в 04:48
поделиться

10 ответов

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

Для завершения потока я использую QueueUserAPC() поставить вызов в очередь к функции, которая выдает исключение. Однако исключение, это брошено, не получено из типа "Исключение", так будет только пойман процедурой обертки моего потока.

Преимущества этого следующие:

  • Никакой специальный код не должен был в Вашем потоке сделать это 'stoppable' - как только это вводит alertable состояние ожидания, это выполнит функцию APC.
  • Все деструкторы вызываются, поскольку исключение увеличивает стек, таким образом, Ваш поток выходит чисто.

Вещи необходимо наблюдать за:

  • Что-либо выполнение catch (...) съест Ваше исключение. Пользовательский код должен всегда использовать catch(const Exception &e) или подобный!
  • Удостоверьтесь Ваш ввод-вывод и задержки сделаны "alertable" способом. Например, это означает звонить sleepex(N, true) вместо sleep(N).
  • Зависящие от ЦП потоки должны звонить sleepex(0,true) иногда проверять на завершение.

Можно также 'защитить' области кода для предотвращения завершения задачи во время критических разделов.

5
ответ дан 6 December 2019 в 23:15
поделиться

Используйте перекрытый IO так, чтобы Вы всегда контролировали потоки, которые имеют дело с Вашим вводом-выводом и могут всегда останавливать их в любой точке; Вы или имеете их ожидающий на IOCP и можете отправить код завершения работы прикладного уровня на него, ИЛИ можно ожидать на событии в ПЕРЕКРЫТОЙ структуре И ожидать на 'всех потоках, завершите работу теперь' события также.

Таким образом, постарайтесь не блокировать вызовы, которые Вы не можете отменить.

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

7
ответ дан 6 December 2019 в 23:15
поделиться

Лучший способ: Сделайте свою работу, в то время как приложение работает, и ничего не сделайте (или как близко к) на завершении работы (работы для запуска также). Если Вы придерживаетесь того шаблона, то можно сразу разъединить потоки (а не "быть хорошим" об этом), когда запрос завершения работы прибывает, не вызывая беспокойство о работе, которая все еще должна быть сделана.

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

2
ответ дан 6 December 2019 в 23:15
поделиться

Я рекомендовал бы иметь Ваш GUI, и работа сделаны на различных потоках. Когда пользователь запрашивает завершение работы, отклоните GUI, сразу дающий появление, которое закрыло приложение. Позвольте рабочим потокам закрываться корректно в фоновом режиме.

2
ответ дан 6 December 2019 в 23:15
поделиться

Если Вы захотите отключить грязно, выйти (0), то добьется цели.

0
ответ дан 6 December 2019 в 23:15
поделиться

Независимо от того, что Вы делаете, НЕ используйте TerminateThread, особенно ни на чем, что могло быть в HTTP-вызовах ОС. Вы могли потенциально повредить IE до перезагрузки.

Измените все свои IO к асинхронной или не блокирующейся модели так, чтобы они могли наблюдать за событиями завершения.

0
ответ дан 6 December 2019 в 23:15
поделиться

Если необходимо внезапно завершить работу: Просто назовите ExitProcess - который является тем, что будет названным сразу же, как только Вы возвращаетесь из WinMain так или иначе. Сам Windows создает много рабочих потоков, которые не имеют никакого пути, который будет очищен - они завершаются завершением работы процесса.

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

0
ответ дан 6 December 2019 в 23:15
поделиться

У меня когда-то была подобная проблема, хотя в Visual Basic 6: потоки из приложения соединились бы с различными серверами, загрузить некоторые данные, выполнить некоторое операционное цикличное выполнение на те данные и хранилище на централизованном сервере результат.

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

Это взаимное исключение было создано только основной формой, после того как это было создано, все потоки скоро закроют себя. Недостаток был то, что пользователь должен был вручную указать, что это хотело выполнить потоки снова - другая кнопка, чтобы "Позволить потокам работать" выполненный это путем выпуска взаимного исключения :D

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

С моделью "квартиры" VB многопоточности несколько трудно отправить информацию от потоков до главного приложения назад и вперед, намного легче "запустить и забыть" или отправить его только от главного приложения до потока. Таким образом, потребность подобных длинных сокращений. Используя C++ Вы свободны использовать свою модель многопоточности, таким образом, эти ограничения не могли бы относиться к Вам.

0
ответ дан 6 December 2019 в 23:15
поделиться

Можно назвать TerminateProcess - это сразу остановит процесс, не уведомляя никого и не ожидая ничего.

0
ответ дан 6 December 2019 в 23:15
поделиться

Дайте пользователю команду отключать компьютер. За исключением этого, необходимо отказаться асинхронных операций к ветру. Или это - HWIND? Я никогда не могу помнить в C++. Конечно, Вы могли взять среднюю дорогу и быстро отметить в текстовом файле или reg ключе, от какого действия отказались так, чтобы в следующий раз прогоны программы это могло заняться тем действием снова автоматически или спросить пользователя, если они хотят сделать так. В зависимости от того, какие данные Вы теряете при отказе от асинхронного действия Вы не можете делать это. Если Вы взаимодействуете с пользователем, можно хотеть рассмотреть диалоговое окно или некоторое взаимодействие UI, которое объясняет почему его занимание много времени.

Лично, я предпочитаю инструкцию пользователю просто отключить компьютер.:)

-5
ответ дан 6 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: