当一个简单的线程中运行无限循环而导致100%CPU时,这怎么可能?
在Qt对话框类中的QEvent上,我的线程调用如下:单击按钮。
pthread_t thread_id;
pthread_create( &thread_id, NULL, DataCollectionThread, (void*) this );
我的线程过程是
void* DataCollectionThread( void* pParam )
{
((m_DataCollection*)pParam)->m_ReadDatafromport();
return NULL;
}
这个
ReadData()
包含...while(1)
{
}
我的要求是从串行端口收集数据并连续绘制图形。但是,由于CPU使用率为100%,因此在绘图之间的任何硬件中断都会导致绘图停止,因为
CPU
将任务切换为处理中断。我在基于
Qt::Dialog
的类中调用此线程。我很确定没有触发任何其他 Action 。这怎么了一个简单的无限循环会导致100%的CPU消耗吗?还是在Qt中使用pthread_create有任何问题?编辑:对于Jonathon Reinhart
这是实际的while循环
while( 1 )
{
while(( Dataisavailable))
{
//push the read data to stack
}
if(!m_DataReadable)
break;
}
最佳答案
解决此问题的一种简单方法:进入(短时间)睡眠,让CPU做其他事情。 #include <ctime>
并在循环中添加:
struct timespec ts;
ts.tv_sec=0;
ts.tv_nsec=10000000; // 10 milliseconds
nanosleep(&ts, NULL);
当然,如果您可以明确地睡觉直到您有实际工作要做(读取更多的输入,修剪整个队列)会更好。但是增加短暂的睡眠可能就足够了。
查看
m_pDataProvider
对象的实现可能很有意义。检查或添加一种方法,使您可以进入睡眠状态,直到有更多数据为止。如果您只是从字符设备(例如ttyS0)中读取,此处poll
或select
可能会有用。关于c++ - 一个简单的pthread_create导致Qt中的CPU使用率达到100%,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11238471/