Я думаю, у вас есть фундаментальное неправильное понимание того, как предполагается использовать потоки.
Такие функции, как SuspendThread()
и ResumeThread()
и функции для завершения потоков, не предназначены для управления потоками. Фактически функции Windows API, на которые отображаются SuspendThread()
и ResumeThread()
, задокументированы как предназначенные для отладчиков. Было бы неплохо, если бы в документации MFC об этом говорилось, но это не так.
Если вы используете SuspendThread()
для приостановки потока, тогда вы не представляете, что он делает, когда приостанавливаете его. Если случается, что блокировка удерживается, вы можете заблокировать вашу программу.
Обычный механизм управления потоками состоит в том, чтобы использовать объекты событий, чтобы сообщить потоку, что вы хотите, чтобы он приостановил или возобновил. Причина, по которой объекты событий используются, а не простые логические флаги, скажем, в том, что события можно ожидать. Это означает, что вы можете перевести поток в незанятое состояние, не использовать ЦП и запускать его при сигнале управляющего потока.
Что касается терминации, это абсолютно последнее средство, чтобы позвонить TerminateThread()
. Это оставляет ваши объекты синхронизации (например, критические секции, мьютексы и т. Д.) В неопределенном состоянии и с большой вероятностью приведет к ужасным дефектам в вашем программном обеспечении. Снова для завершения вы должны сообщить потоку, что вы хотите, чтобы он вышел, и затем подождать, пока это не будет сделано.