QTread类是Qt编写多线程程序的一个最基础的类,它本身的使用是比较简单的。但是多线程编程最重要的是整个编程模型。在使用QTread类时对几个函数的作用需要理解。run(),exec(),start(),quit()或exit(0),wait()。
首先,我们要清楚,我们运行一个线程的时候一般都是处理计算密集型或者I/O密集型的操作,在这些操作中我们至少需要一个交互,就是计算或I/O操作结束时得到一个通知。好结束该线程。另外,我们可能需要对处理过程进行监听。典型的就是进度条了。
start()------->run()-------->exec()
exit(0)或quit()使线程从exec()中返回
wait(unsign longlong time)阻塞线程使线程执行完 (exec()后到run()结束块的操作即从run()函数返回)或等待time时间后结束。
在理解这几个函数,我们需要区分线程内和线程外(创建该线程的进程或线程)。
线程内执行的函数有run(),exec()
run()函数是线程启动执行的函数。exec()函数是线程进入事件循环的函数。
这里有些难以理解的是要把exec() ==loopevent,最初我就困惑在这里,以为exec()是启动run()函数,理解了这个命名,就会对Qt主函数的a.exec()就好理解了。
一般在run函数中,
1、先声明好对象A,….;
2、构建对象间的connect或对象与QThread子类自身的信号槽连接;
3、运行要执行的函数A.dosomething(),…….;
4、在使线程进入事件循环exec();这样在A.dosomething()执行到某个特定信号会发出的时候,便会执行connect对应的槽或信号函数。
5、exec()后到run()结束块的操作
线程外执行的函数start():
start()是启动一个线程,该线程直接执行run()函数。线程只有在中调用该线程的线程创建。也就是说QThread类的构造函数是在调用该线程的线程执行的。所以如果要在线程中new一个类的实例。得把new操作放到run()函数中。只需该线程拥有的数据都在run函数中实例化。
线程外执行的函数exit(),wait()
若在线程内接收到某个信号想结束整个线程,则在QTread子类的自定义槽中执行这些函数,严格来说QTread子类自定义的槽函数可以由connect函数的第5个参数来决定是在线程内执行或者在调用该线程的线程执行。
自己写了一个简单socket5协议的客户端,应用了QTCPSocket类,下载地址http://download.csdn.net/detail/wenwenxiong/8338007