我在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:
};
答案 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
,您可以通过传递可在线程之间安全传输的对象来避免此特定问题。