Необходимо перейти в настройки YouTube> Диспетчер видео> нажмите «Редактировать видео»> «Дополнительные настройки»> «Параметры дистрибутива»> «Разрешить внедрение»
Я использую основанную на исключении технику, это работало вполне прилично на меня во многих приложениях Win32.
Для завершения потока я использую QueueUserAPC()
поставить вызов в очередь к функции, которая выдает исключение. Однако исключение, это брошено, не получено из типа "Исключение", так будет только пойман процедурой обертки моего потока.
Преимущества этого следующие:
Вещи необходимо наблюдать за:
catch (...)
съест Ваше исключение. Пользовательский код должен всегда использовать catch(const Exception &e)
или подобный!sleepex(N, true)
вместо sleep(N)
.sleepex(0,true)
иногда проверять на завершение.Можно также 'защитить' области кода для предотвращения завершения задачи во время критических разделов.
Используйте перекрытый IO так, чтобы Вы всегда контролировали потоки, которые имеют дело с Вашим вводом-выводом и могут всегда останавливать их в любой точке; Вы или имеете их ожидающий на IOCP и можете отправить код завершения работы прикладного уровня на него, ИЛИ можно ожидать на событии в ПЕРЕКРЫТОЙ структуре И ожидать на 'всех потоках, завершите работу теперь' события также.
Таким образом, постарайтесь не блокировать вызовы, которые Вы не можете отменить.
Если Вы не можете и Вы застрять в блокирующемся вызове сокета, делающем IO затем, Вы могли всегда просто закрывать сокет от потока, который решил, что пора закрыть и иметь поток, который это делает, IO всегда проверяют 'завершение работы теперь' событие перед повторением...
Лучший способ: Сделайте свою работу, в то время как приложение работает, и ничего не сделайте (или как близко к) на завершении работы (работы для запуска также). Если Вы придерживаетесь того шаблона, то можно сразу разъединить потоки (а не "быть хорошим" об этом), когда запрос завершения работы прибывает, не вызывая беспокойство о работе, которая все еще должна быть сделана.
В Вашей определенной ситуации необходимо было бы, вероятно, ожидать IO для окончания (записи, по крайней мере) при выполнении локальной работы там. Запросы HTTP и такой, от которого можно, вероятно, просто отказаться/закрыть напрямую (снова, если Вы не пишете что-то). Но если имеет место, что Вы пишете во время этого завершения работы и ожидаете на этом, затем можно хотеть уведомить пользователя того, что, вместо того, чтобы позволить процессу выглядеть подвешенным при оборачивании вещей.
Я рекомендовал бы иметь Ваш GUI, и работа сделаны на различных потоках. Когда пользователь запрашивает завершение работы, отклоните GUI, сразу дающий появление, которое закрыло приложение. Позвольте рабочим потокам закрываться корректно в фоновом режиме.
Если Вы захотите отключить грязно, выйти (0), то добьется цели.
Независимо от того, что Вы делаете, НЕ используйте TerminateThread, особенно ни на чем, что могло быть в HTTP-вызовах ОС. Вы могли потенциально повредить IE до перезагрузки.
Измените все свои IO к асинхронной или не блокирующейся модели так, чтобы они могли наблюдать за событиями завершения.
Если необходимо внезапно завершить работу: Просто назовите ExitProcess - который является тем, что будет названным сразу же, как только Вы возвращаетесь из WinMain так или иначе. Сам Windows создает много рабочих потоков, которые не имеют никакого пути, который будет очищен - они завершаются завершением работы процесса.
Если у Вас есть какие-либо потоки, которые выполняют записи некоторого вида - очевидно, им нужен шанс закрыть их ресурсы. Но что-либо еще - игнорирует предупреждения средства проверки границ и просто вытягивает коврик из-под их ног.
У меня когда-то была подобная проблема, хотя в Visual Basic 6: потоки из приложения соединились бы с различными серверами, загрузить некоторые данные, выполнить некоторое операционное цикличное выполнение на те данные и хранилище на централизованном сервере результат.
Затем новое требование было то, что потоки должны быть stoppable от основной формы. Я выполнил это в легком хотя грязный вид при наличии остановки потоков после N циклы (эквивалентный примерно половине секунды), чтобы попытаться открыть взаимное исключение с собственным именем. На успех они сразу остановили то, что они делали и выходили, продолженный иначе.
Это взаимное исключение было создано только основной формой, после того как это было создано, все потоки скоро закроют себя. Недостаток был то, что пользователь должен был вручную указать, что это хотело выполнить потоки снова - другая кнопка, чтобы "Позволить потокам работать" выполненный это путем выпуска взаимного исключения :D
Этот прием, как гарантируют, будет работать на взаимоисключающие операции, являются атомарными. Проблема, Вы никогда не уверены обсуждение, действительно закрывшее - отказ в логике обработки "openMutex" случай, за которым следуют, мог означать, что это никогда не заканчивается. Вы также не знаете, когда/если все потоки закрылись (предположение, что Ваш код является правильным, это заняло бы примерно то же время, которое требуется, чтобы циклы остановились и "послушали").
С моделью "квартиры" VB многопоточности несколько трудно отправить информацию от потоков до главного приложения назад и вперед, намного легче "запустить и забыть" или отправить его только от главного приложения до потока. Таким образом, потребность подобных длинных сокращений. Используя C++ Вы свободны использовать свою модель многопоточности, таким образом, эти ограничения не могли бы относиться к Вам.
Можно назвать TerminateProcess - это сразу остановит процесс, не уведомляя никого и не ожидая ничего.
Дайте пользователю команду отключать компьютер. За исключением этого, необходимо отказаться асинхронных операций к ветру. Или это - HWIND? Я никогда не могу помнить в C++. Конечно, Вы могли взять среднюю дорогу и быстро отметить в текстовом файле или reg ключе, от какого действия отказались так, чтобы в следующий раз прогоны программы это могло заняться тем действием снова автоматически или спросить пользователя, если они хотят сделать так. В зависимости от того, какие данные Вы теряете при отказе от асинхронного действия Вы не можете делать это. Если Вы взаимодействуете с пользователем, можно хотеть рассмотреть диалоговое окно или некоторое взаимодействие UI, которое объясняет почему его занимание много времени.
Лично, я предпочитаю инструкцию пользователю просто отключить компьютер.:)