Qt中关于线程需要注意的地方
2012-02-09 14:59
295 查看
以前一直没弄多线程的东西,这几天试了以下,结果弄出很多问题出来,记录下。
如何删除线程:
为了可以动态调节线程的数量,我把所有的线程都放在一个vector中,当需要的数量大于vector.count()的时候则创建并加入线程;当需要减少线程数的时候则通过如下代码实现:
QThread* thd = vector.last();
delete thd;
vector.pop_back();
普通用法估计没有什么问题,但在需要动态调节数量并且这些线程都共用一些东西的时候就有很大的问题了。
delete thd;并没有让线程结束,如果是在windows下可以说只是将其操作的HANDLE给删除掉了,并没有停止代码块在系统线程队列的运行,所以其实我们的线程还是运行当中的,并且这样处理了之后就真的无法停止线程了。
这样做的坏处有2个:
1.访问一些对象(例如线程共享)的时候提示unhandle exception;
2.调用emit signal之后sender()被提示unhandle exception;
所以正确的做法应该是先disconnect(),然后在terminate(),最后delete掉它。
在线程共享数据的时候如果没有特殊要求应该首选通过信号传递指针值,当然别忘了处理完之后delete掉。
没有细看源代码不知道QThread的析构函数在怎么写的,不过从这里可以看出析构函数中并没有停止线程执行的相关操作,小小的失望了下。
如何删除线程:
为了可以动态调节线程的数量,我把所有的线程都放在一个vector中,当需要的数量大于vector.count()的时候则创建并加入线程;当需要减少线程数的时候则通过如下代码实现:
QThread* thd = vector.last();
delete thd;
vector.pop_back();
普通用法估计没有什么问题,但在需要动态调节数量并且这些线程都共用一些东西的时候就有很大的问题了。
delete thd;并没有让线程结束,如果是在windows下可以说只是将其操作的HANDLE给删除掉了,并没有停止代码块在系统线程队列的运行,所以其实我们的线程还是运行当中的,并且这样处理了之后就真的无法停止线程了。
这样做的坏处有2个:
1.访问一些对象(例如线程共享)的时候提示unhandle exception;
2.调用emit signal之后sender()被提示unhandle exception;
所以正确的做法应该是先disconnect(),然后在terminate(),最后delete掉它。
在线程共享数据的时候如果没有特殊要求应该首选通过信号传递指针值,当然别忘了处理完之后delete掉。
没有细看源代码不知道QThread的析构函数在怎么写的,不过从这里可以看出析构函数中并没有停止线程执行的相关操作,小小的失望了下。
相关文章推荐
- 关于Qt中QMap的一个需要注意的地方
- 关于js的核心笔记--需要注意的地方都在这里啦,有测试代码
- 关于Ibatis从页面传入数据持久层需要注意的地方
- 关于Android创建Activity需要注意的地方
- 关于Servlet需要注意的地方
- 关于CQ Schema需要注意的地方(1)
- 关于相对布局中控件摆放位置的一个需要注意的小地方
- 关于找工作的过程中需要注意的地方
- 关于Stm8库函数使用需要格外注意的地方
- 编写控制台程序需要注意的地方,一旦主线程结束,所有子线程会跟着结束
- Java编程关于性能需要注意的地方
- 关于jdbc编程的几点需要注意的地方
- 关于Android BroadcastReceiver一点点需要注意的地方
- 关于x86下VB、C#、VC中的整数运算需要注意的地方
- 写CSS_关于Border你可能需要注意的地方第1/2页
- 关于CQ Schema需要注意的地方(2)
- 关于block使用需要注意的地方
- 关于在使用parseInt进行日期判断需要注意的地方
- 关于vim文件格式的一个需要注意的地方
- qt国际化与本地化中一个需要注意的地方