簡體   English   中英

Qt從另一個成員函數並發運行成員函數

[英]Qt Concurrent run member function from another member function

我想在一個從另一個成員調用它的單獨線程中啟動一個成員函數。 也許下面的代碼更清晰。

有一個按鈕可以在線程中啟動計數器,並且可以正常工作:

void MainWindow::on_pushButton_CountNoArgs_clicked()
{
   myCounter *counter = new myCounter;
   QFuture<void> future = QtConcurrent::run(counter, &myCounter::countUpToThousand);
}

MyCounter類的成員函數:

void myCounter::countUpToHundred()
{
   for(int i = 0; i<=100; i++)
   {
      qDebug() << "up to 100: " << i;
   }
}


void myCounter::countUpToThousand()
{
   for(int i = 0; i<=1000; i++)
   {
      qDebug() << "up to 1000: " << i;
      if (i == 500)
      {
          //here I want to launch myCounter::countUpToHundred() in another thread
      }
   }
}

提前致謝。

假設要並行運行2個計數器,則有3個線程:

線程1:UI線程(或主線程)

在這里運行on_pushButton_CountNoArgs_clicked() 您不應為此功能而費勁,因為如果要每秒達到60幀,則所有工作只有16毫秒。 啟動一個新線程以運行countUpToThousand()是一個好主意。

線程2:后台線程(由QtConcurrent啟動,運行countUpToThousand)

這與線程1並行運行,並且您正在使用myCounter的相同實例(即,內存中的相同位置),因此請注意您讀取和寫入的成員變量。

線程3:后台線程(由QtConcurrent啟動,運行countUpToHundred)

開始使用(如漢克指出)

void myCounter::countUpToThousand()
{
   for(int i = 0; i<=1000; i++)
   {
      qDebug() << "up to 1000: " << i;
      if (i == 500)
      {
          QtConcurrent::run(this, &myCounter::countUpToHundred);
      }
   }
}

這將與線程1和線程2並行運行。

現在,當一個計數器在999處而另一個計數器在88處時,您可能會得到諸如988\\n99\\n瘋狂輸出結果,因為線程2和線程3將同時打印到控制台,而不必關心另一個線程是在做。

另請注意,在執行完線程2和線程3之前,切勿刪除counter ,因為這樣做會繼續嘗試訪問內存,並且您的應用程序可能會崩潰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM