在Qt中将数据从工作线程发送到gui线程

时间:2013-03-07 16:35:45

标签: c++ multithreading qt

如何将unsigned char buf[10]数组从worker函数发送到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线程中的函数,它应该处理来自worker的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");
}

1 个答案:

答案 0 :(得分:2)

建立连接的正确方法是:

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

然而,您将遇到尝试建立排队连接的问题,并且Qt不知道如何处理排队类型。有很多方法,但您会发现将数据放入容器(如QByteArrayQVector而不是原始数组)要容易得多。