Qt QThread

2015-05-12  来源:本站原创  分类:软件工程  人气:795 

多线程考虑的几件事:

  • 实例变量属于哪个线程?(不是在子线程中定义的,都是主线程,假设只有俩线程,多了以此类推)。
  • 在哪个线程定义的实例变量的函数都是在该线程中执行的。
  • 连接线程的事件(信号与槽),属于跨线程通讯,还是本线程通讯。
  • 可以通过moveToThread(QThread)来改变该变量的所属范围(即该实例变量移到了这个线程)

主要把握实例变量的所属问题,然后考虑多线程调度是否会访问同一变量,是否需要加锁。加锁后是否因为不当代码导致了死锁问题。

线程应该是一个重量级的东西,应该考虑成类似main程序的入口问题,而不是执行代码段的一个小工具。要建立这种层次概念。

入口问题的编程模式:

class MyObject:Object
{
public slots:
    void func(){...}
    void func(){...}
}

int main()
{
    MyObject obj;
    QThread thread;
    obj.moveToThread(&thread);
    connect(&other,SIGNAL(),&obj,SLOT(func));
    thread.start();
}

这里可能connect并不像这么用(这里只是一个范例,在主函数连接了这个信号与槽),可能是在某个自定义的类下的构造函数里,只要让该对象移入线程内,然后如果增加信号槽,可能是引用该变量,有时可能需要在类中去move到该线程,没关系,引用该线程变量即可。

以前的错误用法(或者说不太好的方式)是继承qthread,然后move,this。这样在代码依附在线程中,实例了该线程就表示内部代码也一起糅进去了。

好的方式是,单独的qthread,各个功能是独立的,然后移入到该线程中。最后线程运行,各个功能代码也运行起来。

相关文章
  • Qt QThread 2015-05-12

    多线程考虑的几件事: 实例变量属于哪个线程?(不是在子线程中定义的,都是主线程,假设只有俩线程,多了以此类推). 在哪个线程定义的实例变量的函数都是在该线程中执行的. 连接线程的事件(信号与槽),属于跨线程通讯,还是本线程通讯. 可以通过moveToThread(QThread)来改变该变量的所属范围(即该实例变量移到了这个线程) 主要把握实例变量的所属问题,然后考虑多线程调度是否会访问同一变量,是否需要加锁.加锁后是否因为不当代码导致了死锁问题. 线程应该是一个重量级的东西,应该考虑成类似ma

  • Qt 线程基础(QThread.QtConcurrent.QThreadPool等) 2012-11-08

    使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线程时需要非常小心.启动线程是很容易的,但确保所有共享数据保持一致很难.遇到问题往往很难解决,这是由于在一段时间内它可能只出现一次或只在特定的硬件配置下出现.在创建线程来解决某些问题之前,应该考虑一些替代的技术 : 替代技术 注解 QEventLoop::processEvents() 在一个耗时的计

  • Qt 线程基础(QThread.QtConcurrent等) 2012-11-10

    昨晚看Qt的Manual,突然发现下一个版本的Qt中(Qt4.7.4.Qt4.8等)增加了一个特赞的介绍多线程的文章 : Thread Basics 注意: 该链接以后会失效,但是 到时候你直接看Qt自带Manual就行了 本文不是严格的翻译 dbzhang800 2011.06.18 使用线程 基本上有种使用线程的场合: 通过利用处理器的多个核使处理速度更快. 为保持GUI线程或其他高实时性线程的响应,将耗时的操作或阻塞的调用移到其他线程. 何时使用其他技术替代线程 开发人员使用线程时需要非常

  • Qt 中的多线程(一) 2014-04-24

    QT通过三种形式提供了对线程的支持.它们分别是,一.平台无关的线程类,二.线程安全的事件投递,三.跨线程的信号-槽连接.这使得开发轻巧的多线程Qt程序更为容易,并能充分利用多处理器机器的优势.多线程编程也是一个有用的模式,它用于解决执行较长时间的操作而不至于用户界面失去响应.在Qt的早期版本中,在构建库时有不选择线程支持的选项,从4.0开始,线程总是有效的. 线程类 Qt 包含下面一些线程相关的类: QThread 提供了开始一个新线程的方法 QThreadStorage 提供逐线程数据存储 Q

  • Qt 中的多线程(二) 2015-05-03

    可重入与线程安全 在Qt文档中,术语"可重入"与"线程安全"被用来说明一个函数如何用于多线程程序.假如一个类的任何函数在此类的多个不同的实例上,可以被多个线程同时调用,那么这个类被称为是"可重入"的.假如不同的线程作用在同一个实例上仍可以正常工作,那么称之为"线程安全"的. 大多数c++类天生就是可重入的,因为它们典型地仅仅引用成员数据.任何线程可以在类的一个实例上调用这样的成员函数,只要没有别的线程在同一个实例上调用这个成员

  • Qt中的多线程编程 2010-08-18

    Qt中的多线程编程 级 别: 初级 续欣 ([email protected]), 2004 年 4 月 01 日 Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能.为了满足用户构造复杂图形界面系统的需求,Qt 提供了丰富的多线程编程支持. Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功能.为了满足用户构造复杂图形界面系统的需求,Qt 提供了丰富的多线程编程支持.从 2.2 版本开始,Qt 主要从下面三个方

  • Qt下几个线程函数介绍 2012-11-09

    1.QCoreApplication::processEvents() 2.每个线程可以有它的事件循环,初始线程开始它的事件循环需使用QCoreApplication::exec(),别的线程开始它的事件循环需要用QThread::exec().像QCoreApplication一样,QThreadr提供了exit(int)函数,一个quit() slot. 线程安全的函数QCoreApplication::postEvent(),在任何时候,给任何线程中的任何对象投递一个事件,事件会在那个创建

  • qt线程----部分代码片段 2012-11-09

    一.把视频显示到界面的方法 (1)针对qt4的(视频格式为rgb32) v4l_grab_movie(&v4l_dev); unsigned char *pBuffer= v4l_dev.buffer; QImage image(pBuffer,320,240,QImage::Format_RGB32); QPixmap pixmap; pixmap=pixmap.fromImage(image); label->setPixmap(pixmap); label->setFixedSi

  • Qt线程基础(这个比较完整) 2012-11-09

    线程基础 保谓线程? 线程与并行处理任务息息相关,就像进程一样.那么,线程与进程有什么区别呢?当你在电子表格上进行数据结算的时候,在相同的桌面上可能有一个播放器正在播放你最喜欢的歌曲.这是一个两个进程并行工作的例子:一个进程运行电子表格程序;另一个进程运行一个媒体播放器.这种情况最适合用多任务这个词来描述.进一步观察媒体播放器,你会发现在这个进程内,又存在并行的工作.当媒体播放器向音频驱动发送音乐数据的时候,用户界面上与之相关的信息不断地进行更新.这就是单个进程内的并行线程. 那么,线程的并行性

  • Qt技术应用常见问题解答 2012-11-28

    1.如果在窗体关闭前自行判断是否可关闭 答:重新实现这个窗体的closeEvent()函数,加入判断操作 Quote: void MainWindow::closeEvent(QCloseEvent *event) { if (maybeSave()) { writeSettings(); event->accept(); } else { event->ignore(); } } 2.如何用打开和保存文件对话 答:使用QFileDialog Quote: QString fileName =

  • QThread与SLOT 2013-04-14

    众所周知的,Qt的一个核心的消息机制是信号与槽.当用户点击了某个按钮执行某一个非常庞大要执行很久才成完成的操作时,如果我们没有用线程,那么所有的消息循环全部都在app.exec()中完成. app.exec()就是一个很大的循环函数,它的功能就是遍历所有控制,看有没有消息要处理.如果有,则执行.只有等执行完成才能进行下一个操作.如果一个操作耗了大量的时间,那么别的事件都没法做了,包括界面刷新.鼠标事件等. 为了解决这个问题,我们必须得用线程来做.将大工作量的活交给次线程去作,主线程(app.ex

  • Qt的多线程编程注意事项 2014-04-01

    QT总的来说是一个易学易用的库, 但是QT的多线程使用确实容易犯错,尤其是结合上异步的网络访问,谁用谁知道.我觉得核心是一句话,QThread要当作线程控制块用,不要以为派生一个QThread的子类,里面的东西都跑在新的线程里了,只有run()里的是这样. 下面这篇文章我觉得讲的很好,深入解析QT的线程用法,文章有点长,但是值得一读. 原文在 http://qt-project.org/wiki/ThreadsEventsQObjects 译文在 http://www.cppblog.com/b

  • Qt线程和定时器[一] 2014-08-14

    新的线程run里面一定要有exec的调用,否则无法接受消息的. class myQThr : public QThread { Q_OBJECT public: myQThr(QObject *in = NULL) :QThread(in) { WrTimer = new QTimer(this); connect(WrTimer, SIGNAL(timeout()), this, SLOT(TimerOutWr1()), Qt::DirectConnection); WrTimer->star

  • QT线程与定时器[二] 2014-08-14

    下面转一个相关说明吧 实例代码1: class MThread :public QThread { public: MThread(); ~MThread(); virtual void run(); void foo(); ... }; POINT 1:QThread类的实例与普通类的实例没什么不同,只是运行着的run()函数会不同 实例代码2: class MDialog :public QDialog { ... MThread *mythread; }; MDialog::MDialog

  • Qt::ConnectionType 解析 2014-08-14

    signal/slot在底层会使用三种方式传递消息.参见QObject::connect()方法: bool QObject::connect ( const QObject * sender, const char * signal, const QObject * receiver, const char * method, Qt::ConnectionType type = Qt::AutoCompatConnection ) 最后一个参数是就是传递消息的方式了,有四个取值: Qt::Di

  • QThread介绍(译) 2014-09-09

    QThread类提供了独立于平台的处理线程类. 在程序中,一个QThread对象处理一个线程.QThread通过start方法创建一个新线程,新线程调用run方法(所以在程序中看到的是run方法在新线程中运行.是否只有run方法运行在新线程中?).默认情况下,run方法通过调用exec方法启动事件循环,并在线程内运行Qt 事件循环.当退出run方法将会终止这个新线程. 你可以通过QObject::moveToThread方法将worker对象移动到某个线程中. class Worker : pu

  • Qt:多线程学习01 2015-02-08

    在现在的程序中,多线程处理已经是一个非常普遍的现象,在这里根据自己对Qt中的多线程编程做一个简单介绍,欢迎高手指正. 一般来说,传统的Gui程序都是在一个线程中运行,并且此线程同时只能运行一个操作.当程序在执行比较耗时的操作时,用户点击界面会出现程序冻结的现象,此时程序还是在处理前面耗时的操作(如果操作没有执行完),而且也没有空闲处理你的新操作(被无视了).要想避免出现此类情况,可以将Gui放到一个thread中:其余耗时的操作可以放到另外的thread中.这样可以保证在处理耗时操作时,用户对主

  • Qt for Symbian platform to build 2010-03-29

    1. The first erected in the development platform for Symbian-Carbide, here ignored. I'm using Carbide 2.3 version. Ensure normal operation and then perform the following installation Hello world. SDK is best FP1, FP2, S60_5rd. 2.Qt for Symbian instal

  • Introduction to Project 2 QT actual 2010-03-29

    Preceded by a written courseware, including QT to get into some basic analysis, and in culture. On the computer is useless, might as well upload up to share with you

  • Qt programming environment under Windows configuration 2010-03-19

    Eclipse + CDT + MinGW: http://hexlee.javaeye.com/blog/499152 Windows + QT + Eclipse + MinGW tutorial build QT development environment more Keyword: c + + qt eclipse mingw Windows + QT + Eclipse + MinGW detailed tutorial build QT development environme