下载安东阳的歌曲大全:Qt子线程的“信号队列” - Eathan的日志 - 网易博客
来源:百度文库 编辑:偶看新闻 时间:2024/04/29 09:08:40
Qt子线程的“信号队列”
Qt-C++ 2009-11-04 16:58 阅读声明:以下纯属个人理解,看到的就当错的看...
对Qt的多线程编程没有深究,只了解了基本的用法,够我用就行了。
之所以写这篇文章是因为前几天遇到一个疑问:如果其他几个线程同时向一个线程发signal,而这个线程没有自己的事件循环,那是不是会丢失signal呢?
下面是我总结的两种子线程的工作方式
1.让子线程进入事件循环,这样的话多余的signal就会进入该线程的事件队列,不会丢失。问题是这时子线程的槽函数都是在该子线程对象所在的线程(很可能是主线程)执行,这样似乎失去了多线程的意义。
void run()
{
exec();
}
void slot1(); //处理工作
void slot2(); //处理工作
...
2.子线程没有事件循环,直接在run里处理工作,主线程可通过信号连接到该子线程的槽来控制flag,从而控制子线程的暂停和继续。但是,如果还有另外几个线程不时地向通过slot2()给somarg赋值的话,即使给slot2()加了锁保证了不会被同时赋值,但那些同时进入的赋值信号没有队列可进,这样会不会就丢失了呢
void run()
{
while(1)
{
while(flag)
{
dosomething(somarg);
}
}
}
void slot1(); //控制flag
void slot2(); //给somarg赋值
...
经试验,虽然第一种办法不需要exec()进入事件循环也可以触发槽们在调用这个线程对象的线程工作,但是这样无法保证同时传进去的信号不会丢失;加上exec()后,子线程进入事件循环,不会马上结束,并且会有事件队列,这样可以保证信号不会丢失。唯一的缺点就是这些槽不工作在子线程。
拟对策:
建立一个队列线程,CQueueThread,这个线程进入自己的事件循环,在这个类中有其它线程的对象作为成员变量,这些线程则没有各自的事件队列,直接在run中死循环工作,主线程信号连接到CQueueThread的槽来控制其他线程开始工作,这样信号会进入事件队列不会丢失,而那些死循环的繁杂工作则各自在各自的线程中运行。
这个CQueueThread可以用主线程代替(主线程必然是有事件循环的),主线程中有个槽作缓冲用,接收来自各方的命令,再鱼贯发往目标线程。
"run()开的才是新线程,QThread的构造函数以及其他成员都在你的主线程中。"
急需支持线程安全的队列源码,VC下使用
QT的问题
JAVA 队列的实现
打印机的队列问题?
15MnCuCr-QT牌号中QT的含义是什么?
请问,有关QT的问题
队列队行的距离
请问一下QT格式的视频!!!!!急!!!
关于QT designer使用的问题
8086 的复位信号是什么? 有效电平是什么 ?CPU 复位后,寄存器和指令队列处于什么状态 ? 有效电平是什么 ?
超线程的概念,不是线程是超线程??谢谢
一个用C++实现的队列问题
链栈和链队列的实现
询问关于喊队列使用的英文单词
白发魔女队列不能生成的问题
进程队列的概念和形式?
栈和队列的逻辑特征
请求高手帮助!!!!!关于队列的问题
队列元素的进队出队原则是
队列和堆栈的区别是什么
请教关于计算机二级的队列题
各位高手,我想知道哪有把模拟信号的电影转换成数子信号电影的软件呀!!
迅雷线程的问题!!
线程的概念