在Qt中如何从工作线程发送数据到GUI线程

4

如何从工作函数发送 unsigned char buf [10] 数组到 GUI 线程(主线程)?

我试图创建一个信号/槽机制,其中槽将 buf 作为函数参数传递到 GUI 线程中进行处理。

更新:

以下是我已经完成的内容:

工作类:

class Worker : public QObject
{
    Q_OBJECT

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

    int channels_buf[10];
    FILE *data;
    int sock;
    int bits;

public slots:
    void doWork();

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

private:
};

工人构造器
// Worker thread
Worker::Worker(FILE *datafile, int sockint, int bitsint)
    :data(datafile)
    ,sock(sockint)
    ,bits(bitsint)
{

}

Worker::~Worker()
{

}

线程的功能
// Worker functions
void Worker::doWork()
{
    unsigned char buf[10];
    unsigned char crcval;

    memset (buf, 0, 10);

    while(1)
    {
        int i;
        int numb;
        numb  = 0;

        numb = recv (sock, buf, 10, MSG_WAITALL);

        crcval = BP_CRC8 (buf, 9);

        // 8 bits
        if (bits == 0)
        {
            if (crcval == buf[9])
            {
                emit newinfo(buf);
            }
        }
    }

    emit finished();
}

然后我启动线程

Worker *worker;
QThread *workerThread;
worker = new Worker(data, sock, bits);
workerThread = new QThread(this);
connect(workerThread, SIGNAL(started()), worker, SLOT(doWork()));
connect(workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(worker, SIGNAL(newinfo(unsigned char[])), this, SLOT(process_new_info(unsigned char[])));
worker->moveToThread(workerThread);
workerThread->start();

这是在GUI线程中的一个函数,它被设计用来处理来自工作线程的unsigned char buf[10]

void gui::process_new_info(unsigned char buf[10])
{
    int v = 0;

    printf ("%d ->", buf[0]);
    fprintf (data, "%d,", buf[0]);

    for (int i = 1; i < 9; i++)
    {
        v = buf[i];
        printf ("%d,", v);
        fprintf (data, "%d,", v);
    }

    printf ("\n");
    fprintf (data, "\n");
}

你做到哪一步了?它是怎么失败的? - Drew Dormann
我已经创建了工作类,该类在工作构造函数中从GUI线程接收参数。工作线程正在运行。我的问题现在是提取它生成的数据。 :) - SamuelNLP
非常好。请编辑您的问题,展示您已经编写的相关代码以及它存在的不足之处。 - Drew Dormann
@DrewDormann 我已经更新了。 - SamuelNLP
1个回答

3
正确的连接方式是:
``` connect(worker, SIGNAL(newinfo(unsigned char[10])), this, SLOT(process_new_info(unsigned char[10]))); ```
然而,您可能会遇到一个问题,即尝试进行排队连接,而Qt不知道如何处理排队该类型的连接。有解决方法,但您会发现将数据放入容器中(例如QByteArrayQVector)而不是原始数组会更容易些。

好的,即使更改了代码,函数process_new_info也不会被执行。 - SamuelNLP
最有可能的原因是我提到的排队问题。您是否从Qt控制台获得任何警告输出? - Dan Milburn
问题在于我不能使用QByteArray,因为它需要一个const char*作为参数。 - SamuelNLP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接