68请问Qt的多线程问题

68请问Qt的多线程问题,第1张

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多线程编程中子线程如何调用主线程中的成员变量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9637487.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存