Qt多线程简单总结


1. QThread

两种方式,其一是任何继承QObject的类都有moveToThread的方法,利用该方法可以将当前类(继承QObject)中耗时的操作,移动到新线程执行,避免阻塞主线程。其二是通过继承QThread类,重载其run()函数,当前类中耗时的操作在该函数体中实现,但是要注意的一个问题是,继承自QThread的类的构造函数,也即该类的实体在原线程中,而run函数体则在新线程中执行,所以,需要特别注意的是,要避免该类的成员变量被两个线程同时访问,这样会造成不安全性(例如,一个线程执行时,另一个线程修改了成员变量的值,这样就可能出现冲突或者错误,如果需要,那么应该考虑异步运算,利用加锁机制)。此外,继承类中的所有槽函数实现也将是在原来的线程里面运行,只有run函数才会在新线程执行,如果希望槽函数在新线程执行,那么可以使用moveToThread方法(worker-object)来将整个类移到新线程中去,或者在其他地方实现槽函数。


2. QThreadPool

每一个Qt程序有一个QThreadPool类来管理其所有的线程(分配和回收),使用QThread::gloabalInstance可以获得之。当需要执行耗时操作时,为了避免阻塞主线程,可以定义一个处理类使之继承自QRunable,然后重载其run()函数,获取全局QThreadPool对象并调用start函数例如:
Example
此处的hello对象,当run执行完成,QThreadPool会自动回收,若想自己管理,可以通过QRunnable::setAutoDelete()来自定义管理。


3. QtConcurrent命名空间

使用时记得在pro文件中写上QT += concurrent
它是多线程的high-level实现,前面的QThread和QThreadPool所实现的多线程实际意义上只是不阻塞主线程,另外开辟一个线程来执行耗时操作。实质上并没有加速功能。而QtConcurrent命名空间内的函数实现了任务分发的并行计算,可以提高运算速度。
主要函数有:map、mapReduce、reduce、map-reduce、filter、filter-reduce等(详细见Qt帮助文档)
QConcurrent::Run(),需要注意的是run函数实现的线程不支持cancel(),pause()或者progress reporting,只能监测其状态(running/finished)以及获得返回值(通过QFuture,T与run函数类型一样,支持void)。所以若将QprogressDialog或者QProgressBar的cancel信号与线程的cancel连接是不会起作用的,但是map,reduce等函数可以接受cancel信号。Run开的线程并非一定立即执行,它会等待QThreadPool分配可用的线程。

Qt中,我们可以使用多线程来进行UDP的收发操作。以下是一个简单的示例: 首先,我们需要创建一个UDP接收线程和一个UDP发送线程。 UDP接收线程可以继承自QThread类,并重写其run()函数。在run()函数中,我们可以创建一个QUdpSocket对象,并使用bind()函数将其与指定的IP地址和端口号进行绑定。然后,我们可以使用readyRead()信号来检测是否有新的数据到达。一旦有新的数据到达,我们可以使用receiveDatagram()函数来接收数据,并通过信号和槽机制将数据传递给主线程进行处理。 UDP发送线程也可以继承自QThread类,并重写其run()函数。在run()函数中,我们可以创建一个QUdpSocket对象,并使用writeDatagram()函数来发送数据。 在主线程中,我们需要创建一个UDP接收线程的实例和一个UDP发送线程的实例,并将其启动。然后,我们可以通过信号和槽机制将接收到的数据传递给其他需要处理该数据的部分。 需要注意的是,在使用多线程进行UDP收发操作时,我们需要保持数据的同步和线程安全。可以使用互斥锁(QMutex)来控制多个线程对共享资源的访问。 总结起来,使用多线程进行UDP的收发操作需要创建UDP接收线程和UDP发送线程,并在主线程中进行线程的管理和数据的处理。通过合理使用信号和槽机制以及互斥锁,可以实现线程间的数据传输和同步。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值