理解qthreads - 在线程之间共享数据

Sam*_*NLP 3 c++ qt multithreading qthread

我开始了解使用线程的机制,但我想我被困住了,

\n\n

如果我理解,我必须创建自己的类,释放run()方法,然后创建线程。

\n\n

问题是我的线程必须从 gui(主线程)读取一些变量,并且使用它们,它将创建一些其他变量,主窗口将读取并绘制这些变量。

\n\n

问题是 I\xe2\x80\x99m 接收蓝牙连接,该连接必须始终在线程中处于活动状态,但 gui 必须绘制从该线程读取的值。

\n\n

这是需要位于单独线程上的函数:

\n\n
// Listen to the device for data\nvoid gui::listen_device()\n{\n    unsigned char buf[10];\n    unsigned char crcval;\n    fd_set readmask;\n    struct timeval tv;\n\n    tv.tv_sec = 0;\n    tv.tv_usec = 28000;\n\n    memset (buf, 0, 10);\n\n    int v = 0, v1 = 0, v2 = 0;\n\n    while(1)\n    {\n        int i;\n        FD_ZERO (&readmask);\n        FD_SET (sock, &readmask);\n        if (select (255, &readmask, NULL, NULL, &tv) > 0)\n        {\n            if (FD_ISSET (sock, &readmask))\n            {\n                int numb;\n                numb  = 0;\n\n                numb = recv (sock, buf, 10, MSG_WAITALL);\n\n                crcval = BP_CRC8 (buf, 9);\n\n                // 8 bits\n                if (ui->comboBox->currentIndex() == 0)\n                {\n                    if (crcval == buf[9])\n                    {\n                        s++;\n                        // Print of counter\n                        printf ("%d ->", buf[0]);\n                        fprintf (data, "%d,", buf[0]);\n\n                        for (int i = 1; i < 9; i++)\n                        {\n                            v = buf[i];\n                            printf ("%d,", v);\n                            fprintf (data, "%d,", v);\n                        }\n\n                        printf ("\\n");\n                        fprintf (data, "\\n");\n\n                        //fprintf(data, "s: %d, f: %d\\n", s,f);\n                    }\n\n                    else\n                    {\n                        f++;\n                    }\n\n                }\n\n                // 12 bits\n                else if (ui->comboBox->currentIndex() == 1)\n                {\n                    if (numb == 14)\n                    {\n                        // Print of counter\n                        printf ("%d,", buf[0]);\n                        fprintf (data, "%d,", buf[0]);\n                        for (i = 1; i < numb - 1; i += 3)\n                        {\n                            v1 = buf[i] | ((buf[i + 1] & 0x0F) << 8);\n                            v2 = buf[i + 2];\n                            v2 = (v2 << 4) | ((buf[i + 1] & 0xf0) >> 4);\n                            printf ("%d,%d,", v1, v2);\n                            fprintf (data, "%d,%d,", v1, v2);\n                        }\n\n                        printf ("\\n");\n                        fprintf (data, "\\n");\n                    }\n                }\n            }\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

此处读取的一些变量是全局的,如sock, data, and the ui->combobox.

\n\n

我想要buf与主窗口共享。

\n\n

有什么建议吗?

\n\n

更新:

\n\n

为什么这是错误的?

\n\n
void QMyThread::run()\n{\n    listen_device();\n}\n
Run Code Online (Sandbox Code Playgroud)\n

spi*_*orm 5

这是一篇关于在 Qt 中使用线程的好文章
http://qt-project.org/doc/qt-5.0/qtcore/thread-basics.html