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

标签 c++ multithreading qt qthread

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

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

问题是我的线程必须从 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 和 ui->combobox

我希望 buf 与主窗口共享。

有什么建议吗?

更新:

为什么错了?

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

最佳答案

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

关于c++ - 理解 qthreads - 在线程之间共享数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15247531/

相关文章:

c++ - 将 pugixml 节点设置为空?

c++ - 立方根猜谜游戏

java - 为什么必须从同步块(synchronized block)/方法调用等待和通知?

qt - QPainter::rotate 禁用绘制文本的抗锯齿功能

c++ - 为什么我的插槽没有被调用?

c++ - QProgressBar::setValue(int) 导致内存泄漏?

c++ - 在哪里可以找到代表什么函数名称? C++

c++ - Exe 二进制文件仅在 IDE 之外崩溃

java - Java servlet 生成线程以满足请求是否安全?

java - 多个线程访问相同的方法