1

現在、QThreadPool を使用して計算を実行していますが、すべてを QThreadPool に投入すると、実際にはうまく機能せず、クラッシュの問題が発生しているようです。したがって、私の考えは、一度に QThreadPool に渡すスレッドを少数にすることです。QThreadPool を使用して 1 台の PC で数千の計算を処理する方法に関するコードまたは例を誰かが共有できるかどうか疑問に思います。私は次のように書いていますが、現時点ではクラッシュの問題を引き起こしていると感じました (クラス A は QRunnable から継承されています)。

for(int i=0;i<1000;i++)
{
    Class* A = new Class();
    A->doSomeSetting(i);

    A->setAutoDelete(true);

    connect(A,SIGNAL(OutputProvider(int))
       ,this,SLOT(OutputListener(int)),Qt::DirectConnection);

    QThreadPool::globalInstance()->start(A);

    m_thread_count++;

    if(m_thread_count >0 && m_thread_count %m_maxThreadInPool == 0)
    {
        QThreadPool::globalInstance()->waitForDone();
    }
}
QThreadPool::globalInstance()->waitForDone();

そして初期化された設定:

m_maxThreadInPool = 4;
QThreadPool::globalInstance()->setMaxThreadCount(4);
m_thread_count = 0;
std::vector<int> output;

出力リスナー:

void OutputListener(int output)
{
    output.push_back(output);
}

これは正しい方法ですか、それとももっと良い方法はありますか?

また、最大スレッド数を設定する場合、入力できる最大数は使用できるコアの数ですか?

Qt::DirectConnection も使用しています (QueueConnection を使用するには問題がありました)。これは、出力リスナーに書き込むときに問題になりますか?

4

2 に答える 2

2

Qt::DirectConnection に問題がある可能性があります。ドキュメントで述べられているように、スレッド化では Queded 接続を使用する必要があります。QtConcurrent と QFuture および QFutureWatcher を参照してください。このクラスが役立つ場合があります。

于 2014-03-27T11:27:32.493 に答える
1
m_thread_count++;

if(m_thread_count >0 && m_thread_count %m_maxThreadInPool == 0)
{
    QThreadPool::globalInstance()->waitForDone();
}

すべてのタスクが完了するまで 4 つのタスクごとに待機しています。waitForDone への呼び出しをすべて削除すると、改善が見られ、QueuedConnection再び機能します。

スレッドの数よりも多くのタスクを追加できます。余分なタスクは、他のタスクが完了するまで待機します。

于 2014-03-27T11:27:43.147 に答える