Qt中的多线程 - 疑惑和问题

时间:2012-08-27 15:37:26

标签: qt qt4

几乎要搜索几个小时我对多线程概念感到更加困惑,我需要帮助理解和实现它。在搜索之后,我进入了以下实现

的main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"
#include <mythread1.h>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
mythread abc; 
abc.start();
abc.wait();
return a.exec();
}

在上面的代码mythread.h是我为多线程创建的头文件,下面是mythread1.h的代码

mythread1.h

#ifndef MYTHREAD1_H
#define MYTHREAD1_H
#include <QtGui>
#include <windows.h>

class mythread : public QThread
{
public:
    void run();
};

void mythread::run()
{

}



#endif // MYTHREAD_H

现在我的问题是

  1. 我只定义了一个函数run(),当初始化线程时,编译器如何确定它必须执行run()函数以及它具有多个函数时的作用,我得到了这个问题,因为在main.cpp中我只是键入abc.start();并没有指定要执行的内容?
  2. 在mythread1.h内部和运行函数中,我使用while(0&lt; 1)进行了无限循环并运行程序,令我惊讶的是我只是出现了100%CPU使用率的白屏(并不奇怪),但是它应该同时运行而不干扰主线程吗?那为什么会这样呢?
  3. 然后我在mythread1.cpp里面的run函数里面使用QFile::copy("pathtomytargetfile","targetpath");但是没有用:O并且它没有复制那个文件但是当我用主线程中的Push按钮连接它然后它得到了成功复制了,为什么会这样?
  4. 有没有人知道实现多线程的更简单方法?
  5. 谢谢

2 个答案:

答案 0 :(得分:1)

首先:运行方法应该受到保护!

其次,你的意思是“我只定义了一个函数run()”。你定义了方法,而不是功能。 abc.start()表示mythread的abc实例将启动并使用它的入口点方法void run()。您不能使用相同的签名声明多个方法。如果您想知道它是如何调用您的run()而不是QThread::run()那么您需要阅读有关C ++中虚拟方法的内容

广告。 3:我们如何判断为什么你的文件没有复制?检查QFile为您提供的错误。改变你的代码:

QFile f("pathtomytargetfile");
if( ! f.copy("targetpath") )
{
     qDebug() << f.errorString();
}

它将为您提供一些有用的信息

答案 1 :(得分:1)

我的回答可能会让您更加困惑,但我认为以下链接值得一读:

  1. This是介绍QThread课程的工程师的文章。他为建议继承QThread是可行的方法而道歉。
  2. This文章告诉你,你应该怎么做(严格来说 - 从QThread继承也会起作用,它在设计上并不那么好。)
  3. On this page您可以找到Qt提供的多线程技术概述,以及一些帮助决定您应该针对特定问题使用哪种技术。
  4. HTH