使代码运行在一个单独的线程中的方法
2017-10-30 13:48
288 查看
Qt之线程(QThread)
class WorkerThread : public QThread
{
Q_OBJECT
void run() Q_DECL_OVERRIDE {
QString result;
emit resultReady(result);
}
signals:
void resultReady(const QString &s);
};
void MyObject::startWorkInAThread()
{
WorkerThread *workerThread = new WorkerThread(this);
connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
workerThread->start();
}
上面的例子中,在run()返回后线程就会退出,在线程中将不会有任何的事件循环运行除非调用exec()。
注意一个线程实例位于实例化它的旧线程中,而非调用run()的新线程中,这意味着所有线程的排队槽将在旧线程中执行。因此,开发人员希望在新线程调用槽必须使用worker-object方法,新槽不应直接在子类化QThread中来实现。
当子类化QThread时,请记住,构造函数在旧线程中执行,然而run()在新线程中执行。如果一个成员变量的访问来自两个函数,然后从两个不同的线程访问变量,需要检查这样做是否安全。
注:用在不同的线程中的对象进行交互时必须小心。
class WorkerThread : public QThread
{
Q_OBJECT
void run() Q_DECL_OVERRIDE {
QString result;
emit resultReady(result);
}
signals:
void resultReady(const QString &s);
};
void MyObject::startWorkInAThread()
{
WorkerThread *workerThread = new WorkerThread(this);
connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
workerThread->start();
}
上面的例子中,在run()返回后线程就会退出,在线程中将不会有任何的事件循环运行除非调用exec()。
注意一个线程实例位于实例化它的旧线程中,而非调用run()的新线程中,这意味着所有线程的排队槽将在旧线程中执行。因此,开发人员希望在新线程调用槽必须使用worker-object方法,新槽不应直接在子类化QThread中来实现。
当子类化QThread时,请记住,构造函数在旧线程中执行,然而run()在新线程中执行。如果一个成员变量的访问来自两个函数,然后从两个不同的线程访问变量,需要检查这样做是否安全。
注:用在不同的线程中的对象进行交互时必须小心。
相关文章推荐
- delphi 线程教学第七节:在多个线程时空中,把各自的代码塞到一个指定的线程时空运行
- 本来要开始搬家~!~可CSDN又打不开,可能是我RP不好……贴一个这几天学会的老掉牙的技术——远线程运行汇编代码
- 查看代码是否运行在一个我们期望的进程上下文中的方法
- 如何实现多个线程同步 (2013-11-10 12:07:24)转载▼ 标签: it 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题,Java实现线程同步的方法很多
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
- 记录一个在SharePoint的代码中提升运行权限的方法
- 创建并运行一个java线程方法介绍
- [置顶] 判断一个数是不是素数的最快的方法(代码可以运行,Miller_Rabin + 新的)
- 记录一个在SharePoint的代码中提升运行权限的方法
- 记录一个在SharePoint的代码中提升运行权限的方法
- 使用JMX查看一个简单的main方法运行有多少个线程参与
- 在一个有返回值的方法里使用了子线程,如何返回子线程中的值,如下代码中,我在子线程获取到了address的值,但是这个方法的返回结果是空,该如何解决?
- 【利用锁的三种方法来实现在多个线程时只运行一个线程】
- 多线程发送操作之一:运行一个线程的格式化代码(Specifying the Code to Run on a Thread)
- 定义并运行一个线程的两种方法
- 下面的代码实现遍历 IIS 6应用程序池的一个方法
- "无法附加到进程。进程中没有运行的托管代码。要附加到带有 .NET 调试器的进程,托管代码在附加前必须在进程中运行。"--解决方法
- 向一个运行中的进程注入自己的代码
- C#线程:只要任何一个线程在运行,程序就不退出?!
- Visual Studio 2005(C#)中只允许一个实例运行的一种方法