4

unsigned char buf[10]ワーカー関数から GUI スレッド (メイン スレッド) に配列を送信するにはどうすればよいですか。

GUIスレッドで処理する関数のパラメーターにスロットのbufがあるシグナル/スロットメカニズムを作成しようとしていました。

アップデート:

これは私がこれまでに持っているものです:

ワーカークラス:

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();

これはunsigned char buf[10]、ワーカーからの を処理することになっている gui スレッドの関数です。

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");
}
4

1 に答える 1

3

接続を確立する正しい方法は次のとおりです。

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

ただし、キュー接続を確立しようとしているという問題が発生し、Qtはそのタイプのキューイングを処理する方法を知りません。QByteArrayこれを回避する方法はいくつかありますQVectorが、生の配列などのコンテナにデータを配置する方がはるかに簡単です。

于 2013-03-07T17:54:20.187 に答える