0

我在 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()

这是我的工人阶级:

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:

};
4

2 回答 2

2

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

于 2013-03-07T14:54:32.123 回答
2

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

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

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

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

于 2013-03-07T15:08:09.263 回答