Sam*_*NLP 3 c++ qt multithreading qthread
我开始了解使用线程的机制,但我想我被困住了,
\n\n如果我理解,我必须创建自己的类,释放run()方法,然后创建线程。
问题是我的线程必须从 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}\nRun Code Online (Sandbox Code Playgroud)\n\n此处读取的一些变量是全局的,如sock, data, and the ui->combobox.
我想要buf与主窗口共享。
有什么建议吗?
\n\n更新:
\n\n为什么这是错误的?
\n\nvoid QMyThread::run()\n{\n listen_device();\n}\nRun Code Online (Sandbox Code Playgroud)\n