3

スレッドを使用するメカニズムを理解し始めていますが、行き詰まっていると思います。

理解できれば、独自のクラスを作成し、run()メソッドを解放してから、スレッドを作成する必要があります。

問題は、私のスレッドがgui(メインスレッド)からいくつかの変数を読み取らなければならないことです。それらを使用すると、メインウィンドウが読み取ってプロットする他の変数が作成されます。

問題は、Bluetooth接続を受信して​​いることです。これは、スレッド内で常にアクティブである必要がありますが、GUIは、このスレッドから読み取られた値をプロットする必要があります。

これは、別のスレッドにある必要がある関数です。

// Listen to the device for data
void gui::listen_device()
{
    unsigned char buf[10];
    unsigned char crcval;
    fd_set readmask;
    struct timeval tv;

    tv.tv_sec = 0;
    tv.tv_usec = 28000;

    memset (buf, 0, 10);

    int v = 0, v1 = 0, v2 = 0;

    while(1)
    {
        int i;
        FD_ZERO (&readmask);
        FD_SET (sock, &readmask);
        if (select (255, &readmask, NULL, NULL, &tv) > 0)
        {
            if (FD_ISSET (sock, &readmask))
            {
                int numb;
                numb  = 0;

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

                crcval = BP_CRC8 (buf, 9);

                // 8 bits
                if (ui->comboBox->currentIndex() == 0)
                {
                    if (crcval == buf[9])
                    {
                        s++;
                        // Print of counter
                        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");

                        //fprintf(data, "s: %d, f: %d\n", s,f);
                    }

                    else
                    {
                        f++;
                    }

                }

                // 12 bits
                else if (ui->comboBox->currentIndex() == 1)
                {
                    if (numb == 14)
                    {
                        // Print of counter
                        printf ("%d,", buf[0]);
                        fprintf (data, "%d,", buf[0]);
                        for (i = 1; i < numb - 1; i += 3)
                        {
                            v1 = buf[i] | ((buf[i + 1] & 0x0F) << 8);
                            v2 = buf[i + 2];
                            v2 = (v2 << 4) | ((buf[i + 1] & 0xf0) >> 4);
                            printf ("%d,%d,", v1, v2);
                            fprintf (data, "%d,%d,", v1, v2);
                        }

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

ここで読み取られるこの変数の一部は、のようにグローバルsock, data, and the ui->comboboxです。

bufメインウィンドウと共有したい。

何かアドバイス?

アップデート:

なぜこれが間違っているのですか?

void QMyThread::run()
{
    listen_device();
}
4

2 に答える 2

5

Qtでのスレッドの使用に関するすばらしい記事があります
http://qt-project.org/doc/qt-5.0/qtcore/thread-basics.html

于 2013-03-06T14:21:22.900 に答える
0

これを行うにはいくつかの方法があります。前述のように、ミューテックスを使用できます。QByteArray(eg void something(QByteArray))パラメータを使用したキュー接続、またはQThreadStorage両方とも実行可能なソリューションですが、前者の方が単純で、おそらく状況に最も適しています。

また、サブクラス化しないでQThreadください。代わりにQObjectとを使用してください。メインスレッドに常駐し、作成するスレッドを管理するだけです。を使用する前にシグナルをオブジェクトに接続する場合は、必ず。の引数を使用してください。moveToThread()QThreadmoveToThread()Qt::QueuedConnectionQObject::connect()

于 2015-04-02T14:28:30.797 に答える