2

私は、可能な限り単純なマルチスレッド Qtコンソールアプリケーションを作成する方法を理解するのに非常に苦労しています。

QThread クラスの使用方法について、たくさんの記事を読みました。サブクラス QThread と言う人もいれば、QThread のワーカー クラス ラッパーを使用すると言う人もいます。

何度か試行錯誤した後も、マルチスレッドの Qt コンソール アプリケーションを動作させることはできませんでした。

今のところ、派手な Qt GUI は必要ありません。

誰かがコード例のスレッド部分を埋めるのを手伝ってくれませんか? テキストファイルから一度に1行を読み取るだけで、現時点でビジーではない各スレッド(4つのスレッドを使用したい)は、その行をstd::coutでできるだけ早くstdoutに出力するという考えです。印刷するだけです。これを簡単にするために、今のところ他の手の込んだ処理はありません。

#include <QCoreApplication>
#include <QFile>
#include <iostream>

/* QThread stuff here */
/* Don't know how to make it */

int main(int argc, char *argv[])
{
        QCoreApplication a(argc, argv);

        /* Create four instances of threads here and 
           put them to wait readed lines */

    QFile   file("file.txt");
    file.open(QIODevice::ReadOnly | QIODevice::Text);

    while(!file.atEnd()) {
    /* Read lines here but where should they be saved?
       Into a global variable like QList<QByteArray> list ?
       So that each thread can read them from there or where ???? */

       ??? = file.readLine(); 
    }
    file.close();
    a.exit();
}
4

4 に答える 4

1

あなたの目的のために、私はQThreadからのクラス以外はまったく使用しませんQtConcurrent

次のような単純なもの (C++11 を使用していると仮定):

  while(!file.atEnd()) {

   QString line = file.readLine(); 

   QtConcurrent::run([line] 
       { 
         qDebug() << line; 
       }); 
   }

これが高レベルで何を与えるべきかはまだわかりませんが。

于 2013-09-06T11:14:28.457 に答える
1

機能を QRunnable に入れる

おそらく、明示的なニーズに最も近いソリューションは、 QThreadPool. それはあなたが望むことをします: それはそのプールからビジーでないスレッドを選び出し、そこでワーカーを実行します。空きスレッドがない場合は、空きスレッドが利用可能になるたびに排出される実行キューにランナブルを追加します。

ただし、スレッド状態、つまりビジー/非ビジーを明示的に希望することは、新しいパスワードを試す前に応答を待つ必要があるネットワーク侵入システムとはまったく一致しないことに注意してください。に基づいて必要になりますQObjects。ネットワーク接続の管理中にそれを行う方法を示すために、他の回答を変更します。ネットワークの応答を待ってビジー状態でスレッドを浪費するのは、非常に無駄です。あなたはそれをしたくありません。パフォーマンスが低下します。

アプリケーションは I/O バウンドであり、ほとんどの場合、過度のパフォーマンス低下を招くことなく 1 つのスレッドで実行できます。巨大なネットワーク パイプがあり、同時に数万のアカウントをテストしている場合にのみ、複数のスレッドが必要になります。私は真剣です。

#include <QCoreApplication>
#include <QTextStream>
#include <QRunnable>
#include <QThreadPool>
#include <QFile>
#include <cstdio>

class Data : public QString {
public:
    Data(const QString & str) : QString(str) {}
};

class Worker : public QRunnable {
    QTextStream m_out;
    Data m_data;
public:
    void run() {
        // Let's pretend we do something serious with our data here
        m_out << "(" << this << ") " << m_data << endl;
    }
    Worker(const Data & data) : m_out(stdout), m_data(data) {}
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QThreadPool * pool = QThreadPool::globalInstance();

    QFile file("file.txt");
    file.open(QIODevice::ReadOnly | QIODevice::Text);
    while (! file.atEnd()) {
        const Data data(file.readLine());
        Worker * worker = new Worker(data);
        pool->start(worker);
    }
    file.close();
    pool->waitForDone();
}
于 2013-09-06T13:46:46.873 に答える
1

以下のリンクは、Qt でのスレッドの使用に関する情報に役立ちます。

http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/

ファイルの読み取りのみを非同期の方法で行いたい場合、Qt には QtConcurrent のようないくつかの代替手法があります。

http://qt-project.org/doc/qt-4.8/threads-qtconcurrent.html

QtConcurrent の使用に役立つサンプルコードを次に示します。

関数を別のスレッドで実行する

 extern QString aFunction();
 QFuture<void> future = QtConcurrent::run(aFunction);

aFunction には、ファイルを読み取るためのコードが含まれている必要があります。

読み取ったデータは次の方法で返すことができます

QFuture<QString> future = QtConcurrent::run(aFunction);
 ...
QString result = future.result();

QFuture::result() 関数がブロックされ、結果が利用可能になるのを待つことに注意してください。QFutureWatcher を使用して、関数の実行が終了し、結果が利用可能になったときに通知を受け取ります。

お役に立てれば。上記のコードはすべて Qt のドキュメントから引用しています。

于 2013-09-06T11:15:25.253 に答える