public int _CurrentThread; //form1_load中的,启动线程的代码在这里。 private void Form1_Load(object sender, EventArgs e) { //设置最大线程数 int MaxThread = 5; //获取需要完成的任务列表 OleDbConnection AccessConn = AccessModuleCo
关于QT信号槽与线程问题
进程肯定不会产生了。Qt的信号槽是个很复杂的机制,哥大致给你介绍一下Qt的信号槽既可以同步触发,也可以异步触发。当你进行connect的时候,实际上还有第五个参数(可以自己看SDK的介绍)。如果说是默认的,那么要看信号和槽是否属于同一个线程(这里,你可以简单理解为是否是同一个类),然后根据connect的第五个属性来判断是否是同步还是异步。比如BlockingQueuedConnection模式,就会出现你说的多次触发信号阻塞问题,他只有等到上一个触发完成才能继续。槽函数不会产生新线程,他是决定了槽函数声明在哪个线程中,如果默认情况下,在同一个线程里面是同步的,你此时可以理解为普通调用,如果在不同线程里面,槽函数运行的线程通常是异步调用,但是还有一个所谓的事件中心一直run着在处理,就是一个信号队列,没触发一个信号就入队列,先进先出。
我提供两种比较简单的解决方案
创建一个Receiver的QObject, 该对象必须生存在你继承的线程中
要么给该对象构造对应的信号, 然后与你主线程窗体进行Connect, 一般来说是Queue的Connection
然后在子线程只要Emit你所实现的信号即可
或者用postEvent来解决, 自定义一种Event, 然后持有主线程窗体对象, 然后PostEvent给主线程窗体对象
一个对象的线程就是创建该对象时的线程,而不论该对象的定义是保存在那个线程中;
子线程中定义的对象的情况:( 其实也好理解,子线程中,创建otherObj的时候,不再run()函数中,所以,otherObj对象不属于MyTHread )
1
2
3
4
5
6
7
8
9
10
11
12
13
classMyThread:publicQThread
{
public:
MyThread()
{
//因为该构造函数属于主线程,所以,otherObj依附于主线程,即属于主线程,而不属于子线程MyThread,这是关键
otherObj=newQObject;
}
private:
QObjectotherObj;
};
在我们创建了MyThread对象之后,otherObj的线程依附性是怎样的?是不是就是MyThread所表示的那个线程?
要回答这个问题,我们必须看看究竟是哪个线程创建了它们:实际上,是调用了MyThread构造函数的线程创建了它们。因此,这些对象不在MyThread所表示的线程,而是在创建了MyThread的那个线程中。即主线程,
我们可以通过调用QObject::thread()可以查询一个QObject的线程依附性。
以上就是关于68请问Qt的多线程问题全部的内容,包括:68请问Qt的多线程问题、关于QT信号槽与线程问题,小白求助、Qt多线程编程中子线程如何调用主线程中的成员变量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)