1

ほとんど何時間も検索して、マルチスレッドの概念についてさらに混乱し、それを理解して実装するのに助けが必要になりました。検索した後、次の実装にたどり着きました

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() を 1 つだけ定義しました。スレッドが初期化されたときに、コンパイラが run() 関数を実行する必要があると判断する方法と、複数の関数がある場合の動作について、main.cpp で abc と入力しただけなので、この質問を受けました。始める(); 何を実行するかを指定していませんか?
  2. mythread1.h 内と run 関数で、while(0<1) を使用して無限ループを作成し、プログラムを実行しました。驚いたことに、CPU 使用率が 100% の白い画面が表示されましたが (驚くことではありません)、実行する必要があります。メインスレッドに干渉することなく同時に?では、なぜこれが起こっているのですか?
  3. 次にQFile::copy("pathtomytargetfile","targetpath");、mythread1.cpp 内の run 関数内で使用しましたが、機能しませんでした :O そのファイルをコピーしませんでしたが、メイン スレッドのプッシュ ボタンで接続すると正常にコピーされました。なぜこれが起こったのですか?
  4. マルチスレッドを実装する簡単な方法を知っている人はいますか?

ありがとうございました

4

2 に答える 2

1

まず、run メソッドを保護する必要があります。

第二に、「run() 関数を 1 つしか定義していない」とはどういう意味ですか。関数ではなく、メソッドを定義しました。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クラスを紹介したエンジニアの記事です。彼は、from を継承するのがよいと提案したことをお詫びしQThreadます。
  2. この記事では、それをどのように行うべきかを示します (厳密に言えば、からの継承QThreadも同様に機能しますが、デザイン的にはあまり良くありません)。
  3. このページでは、Qt が提供するマルチスレッド技術の概要と、特定の問題に対してどの技術を使用すべきかを判断するのに役立つ情報を見つけることができます。

HTH

于 2012-08-28T11:49:24.397 に答える