Передача QVector в качестве аргумента в QRunnable

Я создаю приложение C ++, использующее Qt для получения данных с камеры линейного сканирования, работающей на частоте 3000 Гц. В другой вопрос (Использование C ++ для взаимодействия с камерой линейного сканирования на частоте 3000 Гц и обработки / отображения данныхЯ получил отличный совет, так как планировал свою стратегию, чтобы атаковать это. У меня сейчас есть конкретная проблема. Я повторю свой отказ от ответственности: я инженер, а не программист … но я учусь по ходу дела.

Я использую QThread постоянно получать данные в QVector, Я излучаю QVector в основной поток GUI, который создает QRunnable и передает его QThreadPool обработать блок данных. Таким образом, я планирую собирать блоки данных и создавать задачи для обработки и реагирования на эти блоки в режиме реального времени. Чтобы просто заставить все части функционировать и компилироваться, я изначально использовал одно целочисленное значение в качестве полезной нагрузки. Я могу постоянно генерировать случайный ИНТ в QThread, выделите поток GUI, создайте QRunnable и работать на ИНТ в пуле потоков. Я горжусь этим. Тем не менее, я не могу заставить его работать с 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!» Я знаю, что это длинный пост, но я не знаю, как еще больше упростить MWE, и все еще иллюстрирую мою проблему, так как я не знаю, где начинается проблема с QVector … отсюда и все файлы. Я надеюсь, это подчеркивает, что я действительно пытался заставить это работать.

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);
}

acquire.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

acquire.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);
}
}

algorithm.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

algorithm.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;
}

2

Решение

Сообщение об ошибке означает, что вы пытаетесь использовать неполный тип. Вам нужно добавить #include <QVector> к вершине algorithm.h,

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]