[英]Synchronising main thread and worker thread
在QT中,我從main(GUI)線程創建一個工作線程來執行某些操作,該操作訪問兩個線程共享的資源。 在GUI中執行某些操作時,主線程必須操縱資源。 我嘗試使用QMutex
鎖定該特定資源。 該資源由工作線程連續使用,如何在此通知主線程? 使用QWaitCondition
嘗試過,但是它使應用程序崩潰了。
還有其他選項可以通知並實現線程之間的同步嗎? 附加了代碼段。
void WorkerThread::IncrementCounter()
{
qDebug() << "In Worker Thread IncrementCounter function" << endl;
while(stop == false)
{
mutex.lock();
for(int i = 0; i < 100; i++)
{
for(int j = 0; j < 100; j++)
{
counter++;
}
}
qDebug() << counter;
mutex.unlock();
}
qDebug() << "In Worker Thread Aborting " << endl;
}
//Manipulating the counter value by main thread.
void WorkerThread::setCounter(int value)
{
waitCondition.wait(&mutex);
counter = value;
waitCondition.notify_one();
}
您使用的等待條件完全錯誤。 我敦促您閱讀互斥量和條件,也許看看一些示例 。
wait()將阻止執行,直到在某處調用notify_one()或notify_all()為止。 當然,這不可能發生在您的代碼中。
您不能在一行上使用wait()條件,然后如果它們包含唯一的喚醒調用,則不能期望接下來的兩行被調用。
您想要的是在一個線程中使用wait(),在另一個線程中使用notify_XXX()。
您可以在同一過程中使用共享內存。 每個線程可以在編寫之前將其鎖定,如下所示:
QSharedMemory *shared=new QSharedMemory("Test Shared Memory");
if(shared->create(1,QSharedMemory::ReadWrite))
{
shared->lock();
// Copy some data to it
char *to = (char*)shared->data();
const char *from = &dataBuffer;
memcpy(to, from, dataSize);
shared->unlock();
}
您還應該鎖定它以便閱讀。 如果需要使用字符串,則以零結尾的情況下,讀取字符串要比編寫字符串更容易。 您需要將.toLatin1()轉換為以零結尾的字符串,該字符串可以獲取字符串的大小。 您可以使用shared-> attach()獲得一個可以讀取多個線程的鎖。 但這更多是為了讀取不同進程的共享內存。
您可能只使用它而不是靜音。 我認為,如果您嘗試鎖定它,而其他東西已經將其鎖定,它將阻塞直到其他進程將其解鎖。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.