Kyudos Ответов: 1

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

Спасибо Вам за ваши отзывы. Я добавил решение, так что дело может быть закрыто.

1 Ответов

Рейтинг:
12

Jochen Arndt

Судя по обновленному вопросу и комментариям, это, похоже, решает проблему:

Использование таймеров Windows часто является не лучшим выбором. Для периодических действий, связанных с аппаратным обеспечением и / или чувствительных к нагрузке системы, рабочий поток может быть лучшим решением:


  • Создайте рабочий поток и событие завершения.
  • В рабочем потоке используйте WaitForSingleObject() с дескриптором события terminate и тайм-АУ вашего сердцебиения внутри цикла while.
  • После завершения события покиньте цикл и вернитесь из потока.
  • После тайм-аута выполните функцию сердцебиения.
  • При выходе из программы запустите событие terminate.

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


SoMad

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

ОП сказал, что отметит это как ответ - надеюсь, он не забыл.

Сорен Мадсен

Jochen Arndt

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