2

Qt を使用して C++ アプリケーションを構築し、3000Hz で動作するラインスキャン カメラからデータを取得しています。別の質問 ( C++ を使用して 3000Hz でラインスキャン カメラとインターフェースし、データを処理 / 表示する) で、これを攻撃するための戦略を計画する際に素晴らしいアドバイスを受け取りました。私は今、特定の問題を抱えています。免責事項を繰り返します。私はエンジニアであり、プログラマーではありません...しかし、私は学びながら学んでいます。

を使用して、QThreadデータを に継続的に取得してQVectorいます。メインQVectorの GUI スレッドに を発行します。メインの GUI スレッドは を作成し、QRunnableそれを に渡してQThreadPoolデータ ブロックを処理します。このようにして、データのブロックを取得し、それらのブロックを「リアルタイム」で処理して応答するタスクを作成する予定です。すべての部品を機能させてコンパイルするために、最初は単一の整数値をペイロードとして使用していました。でランダムなintを継続的に生成QThreadし、GUI スレッドに出力し、 を作成し、スレッド プールでintQRunnableを操作できます。私はそれを誇りに思っています。ただし、 . で動作させることはできません。次のようないくつかのコンパイル エラーが発生します。QVector

main.cpp:12:5: error: use of undeclared identifier 'qRegisterMetaType'
    qRegisterMetaType<QVector<unsigned short> >("QVector<unsigned short>");

main.cpp:12:47: error: expected '(' for function-style cast or type construction
    qRegisterMetaType<QVector<unsigned short> >("QVector<unsigned short>")

**編集: 上記のエラーは明らか#include <QMetaType>に main.cpp の欠落によるものです。これを、以下のすべてのコメント/回答の情報と組み合わせて、コンパイルするコードを取得しました。**

私はここで本当に深いところを泳いでいるので、エラーメッセージを解読して別のことを試してみるコードをやみくもにいじることに頼っています。プロジェクトを構成する個々のファイルはすべて次のとおりです。 QVector ペイロードを実装しようとしているすべてのコードの上に、int型で動作するコードのビットをコメントアウトしたことに注意してください。「// は int 型で動作します!」を探します。 これが長い投稿であることはわかっていますが、QVector の問題がどこから始まるかわからないため、MWE をさらに単純化して問題を説明する方法がわかりません...したがって、すべてのファイルです。私が本当にこれを機能させようとしたことを強調してくれることを願っています.

main.cpp

#include <QApplication>
#include <QMetaType> // Added based on comments provided on SO
#include "appwidget.h"

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

    QApplication app(argc, argv);

    AppWidget gui;
    gui.show();

    qRegisterMetaType<QVector<unsigned short> >("QVector<unsigned short>");

    return app.exec();
}

appwidget.h

#ifndef APPWIDGET_H
#define APPWIDGET_H

#include <QWidget>
#include <QThreadPool>

#include "acquire.h"
#include "algorithm.h"

class AppWidget : public QWidget
{ Q_OBJECT

 public:
  AppWidget(QWidget *parent = 0);

 protected:
  Acquire thread;
  Algorithm task;

 private slots:
  //void processBlock(int);  // works with type int!
  void processBlock(const QVector<unsigned short>);

};

#endif

appwidget.cpp

#include <QtGui>
#include <iostream>

#include "appwidget.h"

AppWidget::AppWidget(QWidget *parent)
    : QWidget(parent), task({0}) //task(0)
{

    thread.liftoff();
    //connect(&thread, SIGNAL(blockAcquired(int)), this, SLOT(processBlock(int)));  // works with type int!
    connect(&thread, SIGNAL(blockAcquired(const QVector<unsigned short>)), this, SLOT(processBlock(const QVector<unsigned short>)));

    setWindowTitle(tr("TestApp"));
    resize(550, 400);

}

//void AppWidget::processBlock(int slot_arg)  // works with type int!
void AppWidget::processBlock(const QVector<unsigned short> slot_arg)
{
    std::cout << "GUI: received signal: " << &slot_arg << std::endl;
    Algorithm *task = new Algorithm(slot_arg);
    QThreadPool::globalInstance()->start(task);
}

取得.h

#ifndef ACQUIRE_H
#define ACQUIRE_H

#include <QVector>
#include <QMutex>
#include <QThread>
#include <QWaitCondition>

class Acquire : public QThread {

  Q_OBJECT

 public:
    Acquire(QObject *parent = 0);
    ~Acquire();

    void liftoff();

 signals:
    //void blockAcquired(int);  // works with type int!
    void blockAcquired(const QVector<unsigned short>);

 protected:
    void run();

 private:
    QVector<unsigned short> image_buffer;
    QMutex mutex;
    QWaitCondition condition;

};

#endif

取得.cpp

#include <iostream>
#include <time.h>
#include <stdlib.h>

#include "acquire.h"

Acquire::Acquire(QObject *parent)
     : QThread(parent)
{
}

Acquire::~Acquire()
{
    std::cout << "Acquire thread: dying." << std::endl;
    wait();
}

void Acquire::liftoff()
{
    std::cout << "Acquire thread: init." << std::endl;
    start();
}

void Acquire::run()
{

    //int image_buffer; // works with type int!
    QVector<unsigned short> image_buffer(384 * sizeof(unsigned short) * 192);

    forever {

    /* // works with type int!
    image_buffer = rand() % (int)(65535 - 0 + 1);
    nanosleep((struct timespec[]){{0, 800000*192}}, NULL);
    */

    int k=0;
    for (int i=0; i<384; i++) {
        for (int j=0; j<192; j++) {
        image_buffer[k] = 0 + (rand() % (int)(65535 - 0 + 1));
        k++;
        }
        nanosleep((struct timespec[]){{0, 800000}}, NULL);
    }

    //std::cout << "Acquire thread: block acquired: " << image_buffer << std::endl;  // works with type int!
    std::cout << "Acquire thread: block acquired: " << &image_buffer << std::endl;  

    //emit blockAcquired(image_buffer);  // works with type int!
    emit blockAcquired(image_buffer);
    }
}

アルゴリズム.h

#ifndef ALGORITHM_H
#define ALGORITHM_H

#include <QRunnable>
#include <QThread>
#include <QVector>

class Algorithm : public QObject, public QRunnable
{
  Q_OBJECT

 public:
  //Algorithm(int);  // works with type int!
  Algorithm(const QVector<unsigned short>);
  ~Algorithm();

  //int arg_passed;  // works with type int!
  const QVector<unsigned short> arg_passed;

 protected:
  void run();

};

#endif

アルゴリズム.cpp

#include <iostream>
#include "algorithm.h"

//Algorithm::Algorithm(int i) // works with type int!
Algorithm::Algorithm(const QVector<unsigned short> arg_passed)
{
    // arg_passed = i;  // works with type int!
    std::cout << "Algorithm: init." << std::endl;
}

Algorithm::~Algorithm()
{
    std::cout << "Algorithm: dying." << std::endl;
}

void Algorithm::run()
{
    std::cout << "Algorithm: running, " << QThread::currentThread() << std::endl;
    std::cout << "Arg: " << arg_passed << std::endl;
}
4

1 に答える 1

3

エラー メッセージは、不完全な型を使用しようとしていることを意味します。#include <QVector>の先頭に追加する必要がありalgorithm.hます。

于 2013-09-28T01:18:34.363 に答える