Вопрос

QThread::terminate() В документации указано, что не рекомендуется завершать поток, вызывая эту функцию.
В моей программе мне нужно завершить поток до того, как он завершит выполнение.Поток выполняет тяжелые вычисления, и я хочу, чтобы у пользователя была возможность остановить вычисления.
Как я могу это сделать вместо того, чтобы звонить QThread::terminate()?

Это было полезно?

Решение

Установите флаг снаружи потока, который проверяется вычислением внутри потока, и остановите вычисление, если флаг установлен.

Другие советы

Использование флагов — очевидный и наиболее распространенный способ добиться цели, но если вы работаете на платформе Linux/Unix, я бы посоветовал вам вместо этого использовать каналы.У меня была та же проблема, когда я использовал флаг (это делает код небезопасным для потоков, и ошибки, возникающие из-за такого флага, трудно отследить), затем я изменил реализацию, чтобы использовать каналы, которые были эффективным способом сделать необходимое.

Если хотите, для платформы Linux я могу показать вам, как использовать каналы для завершения QThread.

У вас также может быть Windows-эквивалент каналов, о которых я мало что знаю, поскольку мало программировал на платформе Windows.

Надеюсь это поможет

Лучше всего использовать флаг + мьютекс, который сделает решение потокобезопасным.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top