[英]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.