在QT中,从主(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();
}
答案 0 :(得分:2)
您正在使用等待条件完全错误。 我恳请您阅读互斥和条件,并查看some examples。
wait()将阻止执行,直到在某处调用notify_one()或notify_all()。当然,您的代码中不会发生这种情况 您不能在一行上等待()条件,然后如果它们包含唯一的唤醒呼叫,则期望调用接下来的两行。
你想要的是一个线程中的wait()和另一个线程中的notify_XXX()。
答案 1 :(得分:0)
您可以在同一进程中使用共享内存。每个线程都可以在写入之前将其锁定,如下所示:
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-&gt; attach();但这更多的是阅读不同过程的共享内存..
您可以使用此代替静音。我想如果你试图锁定它,而其他东西已经被锁定了,它就会阻塞,直到另一个进程解锁它。