我在我的程序里创建了两个线程,一个用来读取串口信息, 另一个用来对读取到的数据进行处理,但不知怎么的,处理数据总是比串口读取数据要慢, 以到于数据缓冲区越来越大, 我猜是不是线程同步问题, 但我用了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);
}