我想在事件中取消QtConcurent :: map計算。取消QtConcurent計算
這是我的測試代碼(該計算是由一個無限循環來表示):
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被凍結,什麼也沒有完成。感謝幫助 !
好的,我在類Test上有「volatil bool m_interrupted」。我添加了一個public void void interrupt(),它使m_interrupted變爲true。 從主線程中,我將信號連接到集合中的所有對象Test的插槽。我應該有直接,排隊還是自動連接? 插槽是在主線程還是在線程池中執行的?謝謝 ! – saad
@saad:編輯你的問題。顯示新的代碼。並閱讀有關插槽連接的文檔。這取決於qobject屬於哪個線程,因爲它是從線程中運行的事件回發中發送的插槽連接。 – Macke