我写了专业的应用程序,串口线程有一个问题。 我有cpu consuption。当我在我的项目中添加SerialCtrl.h(来自项目SerialCtrl http://www.codeproject.com/Articles/99375/CSerialIO-A-Useful-and-Simple-Serial-Communication)时,我的CPU%变得更加100%所以没有接近40%。
我在ANSI 32位MFC MT中使用VS C ++ 2012 Professional
SerialCtrl.cpp
const unsigned short MAX_MESSAGE = 300;
IMPLEMENT_DYNCREATE(SerialThread,CWinThread)
SerialThread::SerialThread() :m_serialIO(NULL)
{
}
SerialThread::~SerialThread()
{
m_serialIO = NULL;
}
BOOL SerialThread::InitInstance()
{
return TRUE;
}
int SerialThread::Run()
{
// Check signal controlling and status to open serial communication.
while(1)
{
while(m_serialIO->GetProcessActivateValue()==TRUE)
{
if ((serialCtrl().GetPortStatus()==FALSE)&&m_serialIO->GetPortActivateValue()==TRUE)
{
if(serialCtrl().OpenPort(m_serialIO->m_DCB,m_serialIO->m_strPortName)==TRUE)
{
m_serialIO->OnEventOpen(TRUE);
}
else
{
m_serialIO->OnEventOpen(FALSE);
m_serialIO->SetPortActivate(FALSE);
}
}
else if (m_serialIO->GetPortActivateValue()==TRUE)
{
char message[MAX_MESSAGE]={0};
unsigned int lenBuff = MAX_MESSAGE;
unsigned long lenMessage;
if(serialCtrl().Read(message,lenBuff,lenMessage)==TRUE)
{
if(lenMessage>0)
m_serialIO->OnEventRead(message,lenMessage);
}
else
{
m_serialIO->SetProcessActivate(FALSE);
}
}
if (m_serialIO->GetSendActivateValue()==TRUE)
{
unsigned long nWritten;
if(serialCtrl().Write(m_serialIO->m_sendBuffer,m_serialIO->m_sendSize,nWritten)==TRUE)
{
m_serialIO->OnEventWrite(nWritten);
}
else
{
m_serialIO->OnEventWrite(-1);
}
m_serialIO->SetSendActivate(FALSE);
}
if (m_serialIO->m_bClosePort==TRUE)
{
if (serialCtrl().ClosePort()==TRUE)
{
m_serialIO->OnEventClose(TRUE);
}
else
{
m_serialIO->OnEventClose(FALSE);
}
m_serialIO->m_bClosePort=FALSE;
}
}
break;
}
return 0;
}
void SerialThread::ClosePort()
{
serialCtrl().ClosePort();
}
我猜是SerialThread运行哪个问题,但我没有找到如何解决它。 (演出后和其他工具) 你有点想法吗?
谢谢
答案 0 :(得分:0)
我看了你的代码,不幸的是问题来自你正在使用的库/项目。基本上,一体化线程只是循环而不会在任何地方等待,这导致100%的CPU消耗。
你能做什么:
Sleep(1-10)
方法的内部while
循环的末尾添加run()
。这种方法是最糟糕的,它只是修补了潜在的问题。有人建议制作自己的串口包装器:
有关Windows上串行端口的所有信息,请访问:Serial Communications。
IO线程应始终在某处等待。它可以是阻塞的IO调用,如ReadFile()
,也可以是Windows等待对象。
如果可以,请使用重叠IO,即使您不使用异步调用。它将启用同时读取和写入,并使读取和写入可取消(干净利落)。
您只需要一个单独的线程即可阅读。如果你想要一个完全异步的库,可以选择通过消息队列写另一个。