qthread与qwidget使用

上传人:第*** 文档编号:32817815 上传时间:2018-02-12 格式:DOCX 页数:8 大小:30.35KB
返回 下载 相关 举报
qthread与qwidget使用_第1页
第1页 / 共8页
qthread与qwidget使用_第2页
第2页 / 共8页
qthread与qwidget使用_第3页
第3页 / 共8页
qthread与qwidget使用_第4页
第4页 / 共8页
qthread与qwidget使用_第5页
第5页 / 共8页
点击查看更多>>
资源描述

《qthread与qwidget使用》由会员分享,可在线阅读,更多相关《qthread与qwidget使用(8页珍藏版)》请在金锄头文库上搜索。

1、QThread与 QWidget使用原文链接:http:/ Qt 线程基础(QThread、QtConcurrent 等)本文主要内容:在任务一中,用 四 种方式实现:点击界面按钮,开线程运行一段程序,结果显示在一个 Label上。1. 用不正确的方式得到看似正确的结果2. 用 Qt Manual 和 例子中使用的方法3. 用一种好用但被 Qt开发人员批判的方法4. 用一种被开发人员强烈推荐,但 Qt Manual和例子中只字未提的方法 为了简单起见,本文只讲如何做及其结果是什么,而不讲其原因是什么(估计大家对原因也不会感兴趣,详见: QThread 使用探讨 和QThread使用方法)。 本

2、文只考虑两个线程(即主线程和一个次线程)的情况。 QWidget QWidget及其派生类均 不能在次线程中使用或创建 Manual 中的原话: The GUI classes, notably QWidget and all its subclasses, are not reentrant. They can only be used from the main thread. 因为不允许,所以尝试这么做的,几乎很快都能回头。毕竟 signals和slots用起来确实蛮方便 但是,回头后,就理解和用对 QThread 了么? QThread概念一:QThread 对象本身所依附的线程 和它

3、管理的线程不是同一个线程。 前者是主线程 后者是次线程 概念二:你在 QThread派生类中定义的槽是在主线程而不是在次线程中执行的。 run 函数是线程的入口点,run 内的代码才是在次线程中运行的代码 概念三:除了 Manual和 Qt例子中给出的用法外,QThread 有一种更容易且被推荐的使用方法: QThread 应该被看做是操作系统线程的接口或控制点,而不应该包含需要在新线程中运行的代码 需要运行的代码应该放到一个 QObject的子类中,然后将该子类的对象moveToThread到新线程中。 关于本文的例子 为了代码简单,所有例子都是单一的源文件,保存为 main.cpp o 你

4、从代码中包含的 #include“main.moc”应该能看出 为了省几行代码,头文件都是直接包含 QtCore 和 QtGui。 为了清楚告诉大家槽函数分别是在那个线程运行的,调用了几处 currentThreadId 函数 o main 函数中输出主线程 IDqDebug()#include class Thread:public QThread Q_OBJECT public: Thread() public slots: void slot1(int v) qDebug()addWidget(m_label); vbox-addWidget(m_button); setLayout(v

5、box); connect(m_button,SIGNAL(clicked(),this,SLOT(onButtonClicked(); connect(this,SIGNAL(clicked(int),m_thread,SLOT(slot1(int); connect(m_thread,SIGNAL(sig1(QString),m_label,SLOT(setText(QString);m_thread-start(); signals: void clicked(int v); private slots: void onButtonClicked() static int v = 0;

6、emit clicked(v); v+; private: QLabel * m_label; QPushButton * m_button; Thread * m_thread; ; #include main.moc int main(int argc, char* argv) QApplication app(argc, argv); qDebug() m_vals; QMutex m_mutex; ;注意哦,因为 slot 函数在主线程中,而 run函数在次线程中,所以二者需要 QMutex 实现对变量的安全访问。如果你认真看过 Qt自带的例子,会发现它始终强调 QMutex 的使用。

7、尝试三尝试二是正统的做法,但如过你用 Google搜索过。那么你可能不会选择尝试二,而是会使用下面的方法(其他部分和尝试一 完全一样)class Thread:public QThread Q_OBJECT public: Thread() moveToThread(this); .这样以来,slot 函数确实是在次线程工作的,看看控制台输出main: 3056785168 thread: 3024444272 slots1: 3024444272 slots1: 3024444272 .很有意思?不是么,一条 moveToThread(this),移动到自己。然后问题解决了。 因为前面说了,

8、QThread 所依附线程 和 它管理的线程不是同一个。 这样,其实将自己所依附的线程改为自己所管理的线程了。 o()o.哈哈,不要太高兴哦,这个方法看起来比较舒服,但是它是被官方人员强烈批判的用法尝试四终于到我想写的代码了,这是 Qt线程的开发者建议的使用方式,但很可惜。直到目前(Qt4.7.0),手册和例子中对此都只字为提。 我们不子类话 QThread了,我们只需要子类话一个 QObject,然后将其move到 QThread就行了,看代码: 不用子类化 QThrad了,我们只需要子类话一个 QObject,需要在次线程中工作的代码,直接放到它的槽中 class Worker:publi

9、c QObject Q_OBJECT public: Worker() public slots: void slot1(int v) qDebug()addWidget(m_label); vbox-addWidget(m_button); setLayout(vbox); QThread * thread = new QThread(this); m_worker-moveToThread(thread); connect(m_button,SIGNAL(clicked(),this,SLOT(onButtonClicked(); connect(this,SIGNAL(clicked(i

10、nt),m_worker,SLOT(slot1(int); connect(m_worker,SIGNAL(sig1(QString),m_label,SLOT(setText(QString);thread-start(); signals: void clicked(int v); private slots: void onButtonClicked() static int v = 0; emit clicked(v); v+; private: QLabel * m_label; QPushButton * m_button; Worker * m_worker; ;main 函数还是和尝试一完全一样控制台输出结果如下main: 3056961296 slots1: 3024616304 slots1: 3024616304 .一共两个线程,且二者 id不同,说明 slot在次线程中恩。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号