如何在锁定互斥锁的情况下处理主线程中的信号
How do I process signals in main thread with mutex locked?
我正在编写一个多线程Qt应用程序,但由于OpenGL相关的调用,代码的某些部分必须始终在主线程中执行。
模拟问题的粗略代码将是:
QMutex mutex;
void openGLCalls()
{
}
void foo1()
{
mutex.lock();
openGLCalls();
mutex.unlock();
}
class CBHandler : public QObject
{
public:
CBHandler(QObject *parent = NULL)
{
connect(this, SIGNAL(requestCallbackExec()), SLOT(runCallback()), Qt::BlockingQueuedConnection);
}
static CBHandler *Instance();
public slots:
void runCallback ()
{
//in the main thread as object lies there
openGLCalls();
}
signals:
void requestCallbackExec ();
};
class Thread1
{
void run()
{
while(1)
{
mutex.lock();
CBHandler::Instance()->emit requestCallbackExec();
mutex.unlock();
}
}
};
void main()
{
Thread1 thread;
CBHandler cbhandler;
thread.start();
while(1)
{
if(/*some key pressed*/)
{
foo1();
}
}
}
上面的代码确保"openGLCalls(("始终在主线程中执行。但问题是,如果互斥锁被 Thread1 锁定并且主线程尝试调用 foo1,则主线程在尝试锁定互斥锁时会休眠。由于主线程处于休眠状态,因此 Thread1 锁定的互斥锁永远不会解锁,因为"requestCallbackExec"信号永远不会被处理。
您应该让事件循环在等待时.lock()
旋转。似乎没有办法做到这一点。所以你可以忙着等待:
while(!mutex.tryLock()) {
QEventLoop loop;
loop.processEvents();
}
您可以向.tryLock()
调用添加超时以不加热 CPU,但这会花费一些延迟。
相关文章:
- 在双重继承的情况下如何处理非标准构造函数
- 在C++不使用 POW 的情况下处理负指数
- STL:在没有输出的情况下处理两个集合
- 在这种情况下,我将如何继续 1 到 360 的"for loop"处理指针和地址?
- 默认情况下初始化时 POD 是否给予特殊处理 (C++14)?
- 如何在没有性能命中的情况下抽象SIMD代码来处理不同的数据类型
- 为什么在某些特定情况下具有多个线程(并行处理)会降低性能
- 如何在不调用 "-m" 选项的情况下自动化 git 提交来处理内部引号?
- 如何在锁定互斥锁的情况下处理主线程中的信号
- 为什么在指针和数组的情况下,字符数组的处理方式不同
- 在多个继承的情况下,C 编译器如何处理成员变量内存偏移
- 在操作员过载的情况下处理悬空指针/参考
- 如何在不继承手柄的情况下分叉处理
- 处理POSIX信号:如何在不使用BackTrace_symbols的情况下获取堆栈跟踪
- 如何在不同情况下处理具有多个法线的顶点
- B64在数据不是3的倍数的情况下的编码/解码处理
- 在不中断 IO 的情况下处理信号
- 在之前不知道消息长度的情况下处理阻塞的 recv() 函数,并且不想使用 asy I/O
- 在这种特殊情况下,C++如何处理位移运算符
- 如何在不将代码放入头文件的情况下处理任何迭代器