0

イベントで QtConcurent::map 計算をキャンセルしたいと思います。

これは私のテストコードです(計算は無限ループで表されます):

class Test : public QObject
{
    Q_OBJECT

public:
    Test(QObject *parent=0) : QObject(parent){}

    void test()
    {
        qDebug() << tr("thread:") <<  QThread::currentThread();

        //computation
        while(true);
    }
};

テストのリストがあり、次のことを行います。

//QFuture<void> m_concurentResult;
m_concurentResult = QtConcurrent::map(m_collection, &Test::test);
//That's Ok, I have the two outputs :
//  QThread(0x4e21f8, name = "Thread (pooled)")
//  QThread(0x4e21b8, name = "Thread (pooled)")

目標は、ユーザーがボタンをクリックしたときにすべての計算をキャンセルすることです。

void Widget::on_pushButton_clicked()
{
    m_concurentResult.cancel();
    m_concurentResult.waitForFinished();
}

しかし、ボタンをクリックすると、UI がフリーズし、何も実行されません。手伝ってくれてありがとう !

4

2 に答える 2

0

Peppe が言ったように、QTConcurrent はそれ以降の処理をキャンセルするだけです (シーケンスに対してマップまたはフィルター処理を行う場合)。単一のアイテムを中断することはできません。

これは、スレッドは一般にキャンセルまたは中断できないためです。

C++ では、これを自分で管理する必要があります。(例外をスローするスレッドに例外をプッシュすることでスレッドを中断/キャンセルできるように C++ を拡張することについての話がありましたが、詳細は標準に入るにはあまりにも毛むくじゃらでした。)

VM を実行する一部の言語 (Java、Python) では、そのスレッドが Java/Python コードを実行している場合は実行可能ですが、カーネル/ネイティブ) 操作でロックされている場合は実行できません。

だから、while(true)する必要がありますwhile(!m_interrupted)

于 2014-01-22T16:14:09.437 に答える