在Qt中的信号/槽机制中返回一个unsigned char

时间:2013-03-07 14:48:00

标签: c++ multithreading qt signals-slots

我在Qt中使用QThreads,我正在工作人员中创建一个信号,因此它可以返回unsigned char buf[10]以在gui thread中绘制。这是我的信号。

unsigned char Worker::newinfo(unsigned char buf[10])
{
    return buf;
}

这里有什么问题?

在接收buf的函数中,我发出信号,因此可以在gui插槽中捕获:

emit newinfo(buf);

connect(worker, SIGNAL(newinfo(unsigned char[])), this, SLOT(process_new_info(unsigned char[])));

它告诉我newinfo()。{/ p>的多重辩护

这是我的工人阶级:

class Worker : public QObject
{
    Q_OBJECT

public:
    Worker(FILE *datafile, int sockint, int bitsint);
    ~Worker();

    FILE *data;
    int sock;
    int bits;

public slots:
    void doWork();

signals:
    void finished();
    unsigned char newinfo(unsigned char buf[10]);

private:

};

2 个答案:

答案 0 :(得分:2)

这根本没有意义。如果您更改为std::vector<unsigned char>QByteArray,则问题就会消失。

答案 1 :(得分:2)

moc_gui.cpp:110: multiple definition of Worker::newinfo(unsigned char*)' gui.cpp:64: first defined here

信号并不是由程序员明确定义,而是由moc定义。当你定义信号或槽时,它们必须是无效的。

使用QtConcurrent::run()(用于异步执行)和QFutureWatcher(用于异步访问结果)的组合似乎可以实现您想要做的事情。在SO上查找,有很多帖子。

编辑: 首先,上面代码中的return buf[10];返回buf的第11个元素,当你说你有10个元素时,这个元素没有意义。其次,假设其他一切都是正确的,在信号中传输指针是缺陷的来源。两个线程可以同时访问相同的数据,或者GUI可能在无效时尝试访问数据缓冲区。作为ypnos,您可以通过传递可在线程之间安全传输的对象来避免此特定问题。