1

几乎搜索了几个小时,我对多线程概念变得更加困惑,我需要帮助来理解和实现它。经过搜索,我来到了以下实现

主文件

#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。开始(); 并没有指定要执行什么?
  2. 在 mythread1.h 和运行函数中,我使用 while(0<1) 创建了一个无限循环并运行了程序,令我惊讶的是,我刚刚看到白屏,CPU 使用率为 100%(不足为奇),但它应该运行同时不干扰主线程对吗?那么为什么会这样呢?
  3. 然后我QFile::copy("pathtomytargetfile","targetpath");在 mythread1.cpp 中的 run 函数内部使用,但这不起作用:O 并且它没有复制该文件,但是当我将它与主线程中的 Push 按钮连接时,它被成功复制,为什么会这样?
  4. 有谁知道实现多线程的更简单方法?

谢谢

4

2 回答 2

1

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

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

广告。3:我们怎么知道为什么你的文件没有复制?检查 QFile 为您提供的错误。改变你的代码是这样的:

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

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

于 2012-08-28T10:28:40.770 回答
1

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

  1. 是介绍该QThread课程的工程师的一篇文章。他为建议继承自是QThread要走的路而道歉。
  2. 这篇文章告诉你,你应该怎么做(严格来说——继承自QThread也可以,只是在设计方面没有那么好)。
  3. 在此页面上,您可以找到 Qt 提供的多线程技术的概述,以及一些帮助您决定应该使用哪种技术来解决您的特定问题。

高温高压

于 2012-08-28T11:49:24.397 回答