• 6349阅读
  • 0回复

qt多线程 [复制链接]

上一主题 下一主题
离线lzpmail
 
只看楼主 倒序阅读 楼主  发表于: 2011-03-24
关键词: 多线程
我在我的程序里创建了两个线程,一个用来读取串口信息, 另一个用来对读取到的数据进行处理,但不知怎么的,处理数据总是比串口读取数据要慢, 以到于数据缓冲区越来越大, 我猜是不是线程同步问题, 但我用了QMutex。还请高手帮我看看, 下面为两线程的代码。
void UrineThread::run()
{
    int readlen, retval, i;
    char str[TEMPDATABUFSIZE];
    fd_set rfds;
    struct timeval tv ;

    tv.tv_sec = 0;
    tv.tv_usec = 100000;

    printf("thread....\n");
    while (!stopThread)
    {
        FD_ZERO(&rfds);                           // 清空串口接收端口集
        FD_SET(fd,&rfds);                         // 设置串口接收端口集

        while(FD_ISSET(fd, &rfds))                 // 检测串口是否有读写动作
        {
            FD_ZERO(&rfds);                                          // 清空串口接收端口集  每次循环都要清空,否则不会检测到有变化
            FD_SET(fd,&rfds);                                        // 设置串口接收端口集
            retval = select(fd+1,&rfds,NULL,NULL,&tv);

            if(retval == -1)
            {
                printf("an error accured.\n");
                break;
            }
            else if(retval)                                           //retval > 0
            {
                readlen = ::read(fd, str, TEMPDATABUFSIZE);         //读取数据

                printf("readlen value: %d\n", readlen);
                printf("strBuff size : %d\n", dataBuff.size());

                mutex.lock();
                for (i=0; i<readlen; ++i)
                    dataBuff.enqueue(str);
                mutex.unlock();

            /*    str[readlen] = '\0';                                    //给读取的数据加结尾符
                dataBuff.append(str); */                                   //将数据加入到缓冲区中

                FD_ZERO(&rfds);
                FD_SET(fd,&rfds);

                retval = select(fd+1,&rfds,NULL,NULL,&tv);              //判断是否还有数据

                if(!retval)                                             //如果没有数据则退出第二层循环
                {
                    break;
                }
                msleep(200);
            }
        }
        msleep(100);                                                     //无数据时,睡眠100毫秒, 新增的
    }
}

void UrineProcThread::run()
{
    printf("data process.\n");                          //在此处加数据处理代码
    while (!stopThread)
    {
       //这个MakePack()函数是数据处理的,里面有一个while循环,在数据缓冲区为空时才退出
        gHostPackMan.MakePack();                            //解包,并存于包队列中
    }
    printf("urine proc thread sleep.\n");
    msleep(100);
}
快速回复
限100 字节
 
上一个 下一个