QtでTerminateThreadでスレッドが終了できない問題の解決方法
QTでは、TerminateThread関数はスレッドを安全に終了できないので、突然スレッドが終了して、リソースリークやデッドロックが発生する可能性があります。その代わりに、適切にスレッドを終了するための他の手法を使用すべきです。
ひとつの方法はスレッドのキャンセル要求を送ることです。QTでは、QThread::requestInterruption()関数を使って、スレッドにキャンセル要求を送ることができます。スレッドの実行関数では、QThread::isInterruptionRequested()関数を利用して、キャンセル要求を受け付けたら、適切な位置で実行を終了します。
もう1つの方法は、フラグ変数を使用してスレッドの実行を制御することです。スレッドの実行関数内で、スレッドが実行を続けるかどうかを示すフラグ変数を利用できます。スレッドを終了させたいときはこのフラグ変数を「false」に設定してから、適切な場所でこの変数を検査してスレッドの実行を停止させます。
以下はフラグ変数を使用する、スレッド実行制御の例である。
class MyThread : public QThread
{
public:
void run() override
{
while (m_isRunning)
{
// 线程执行的代码
// 检查取消请求
if (isInterruptionRequested())
return;
}
}
void stop()
{
m_isRunning = false;
}
private:
bool m_isRunning = true;
};
スレッドを終了したい場合は、関数 stop() を呼び出して、フラグ変数を False に設定しスレッドの実行を停止できます。
スレッドを正しく終了させるには、リソースの解放やファイルのクローズなど、適切なクリーンアップコードをスレッドの実行関数に追加する必要がある場合がありますのでご注意ください。