CreateProcess и родительские потоки
У меня проблема с сердцебиением моего ключа. Мы использовали таймер, чтобы отправить сердцебиение на наш ключ, чтобы сохранить лицензию живой. Однако, если один из наших процессорных подпроцессов занимает больше времени, чем тайм-аут лицензии ключа, приложение должно быть перезапущено.
Подпроцесс, о котором идет речь, включает в себя запуск стороннего консольного приложения и перенаправление его выходных данных в наш файл журнала. Это под-приложение запускается с помощью
::CreateProcess
. С WM_TIMER
это низкий приоритет, сообщения таймера сердцебиения отключаются, и срок действия лицензии истекает.Поэтому я подумал, что нужно было бы включить таймер сердцебиения в его собственную нить. Я сделал это, но ...
::CreateProcess
похоже, что он блокирует все потоки в Родительском приложении.Я не хочу запускать подпроцесс асинхронно, так как же мне заставить поток сердцебиения продолжать работать в одно и то же время?
Дополнительный:
Мой поток таймера по сути таков:
Потоки И Таймеры[^]
И я только что заметил, что мой консольный класс перенаправления (опционально) делает
WaitForSingleObject
на созданном процессе, который, по-видимому, блокирует родительские потоки. По сути, мне нужно, чтобы мое родительское приложение продолжало свои "фоновые" потоки, ожидая завершения порожденного процесса (без использования WaitForSingleObject?).
Jochen Arndt
CreateProcess возвращается немедленно и не блокируется. Значит, проблема должна быть где-то в другом месте.
Ты по-прежнему использовать WM_TIMER в Вашем новом сердце-бить-нить? Если это так, используйте WaitForSingleObject со значением тайм-аута сердцебиения и дескриптором события kill, установленным при выходе из программы. Тогда таймер сердцебиения не нуждается в обработке сообщений. Вы также можете установить приоритет потока сердцебиения выше приоритета вашего основного приложения.
xenotron
Проблема также может быть в запущенном процессе. Я заметил, что некоторые пороцессы работают так интенсивно (особенно некоторые антивирусные программы в ночном режиме), что вы чувствуете это на пользовательском интерфейсе даже на intel i7.
Code-o-mat
Вы можете показать нам, что делает эта нить? Вы можете использовать ссылку "улучшить вопрос" под вашим постом, чтобы добавить некоторые соответствующие фрагменты кода, не забудьте пометить их соответствующим образом.
Jochen Arndt
Для обновления:
Поток таймера, который вы используете, не является лучшим выбором, потому что он все еще использует таймеры Windows.
Мое предложение:
- Создание рабочего потока и события завершения
- В рабочем потоке используйте WaitForSingleObject с дескриптором события terminate и таймаутом сердцебиения внутри цикла while.
- После завершения события покиньте цикл и вернитесь из потока.
- На время, выполнять свои функции сердца.
- При выходе из программы запустите событие terminate.
Необязательно установите приоритет потока на один выше основного приоритета приложения (см. AfxBeginThread). Ваш внешний процесс, вероятно, будет иметь тот же приоритет, что и Ваше основное приложение. Тогда сердцебиение должно работать (если не задерживается тяжелой нагрузкой на систему с более высокими приоритетами).
enhzflep
Если бы это был ответ,его можно было бы проголосовать...
Jochen Arndt
Спасибо. Я все еще не уверен, что это решит проблему, но думаю, что да. Если есть какая-то положительная обратная связь, я могу опубликовать ее как решение.
Kyudos
Йохен - это отлично работает, спасибо - я бы отметил это как ответ:)
Jochen Arndt
Спасибо Вам за ваши отзывы. Я добавил решение, так что дело может быть закрыто.