gpt4 book ai didi

c++ - 串行端口线程的 CPU 消耗

转载 作者:太空宇宙 更新时间:2023-11-04 13:41:30 28 4
gpt4 key购买 nike

我在编写我的专业应用程序时遇到一个串口线程问题。我有cpu消耗。当我在我的项目中添加 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 运行的问题,但我没有找到解决方法。(性能和其他工具之后)你有什么想法吗?

谢谢

最佳答案

我查看了您的代码,不幸的是问题出在您使用的库/项目上。基本上,一体化线程只是循环,从不在任何地方等待,这导致 100% 的 CPU 消耗。

你可以做什么:

  • run() 方法的内部 while 循环末尾添加一个 Sleep(1-10)。这种方法是最糟糕的,它只是修补了潜在的问题。
  • 使用另一个设计更好的库。
  • 创建适合您使用的自己的库。

一些人建议制作您自己的串行 com 包装器:

您需要了解的有关 Windows 串口的所有信息都在这里:Serial Communications .

IO 线程应该总是在某处等待。它可以在诸如 ReadFile() 之类的阻塞 IO 调用上,也可以在 Windows 可等待对象上。

如果可以,请使用重叠 IO,即使您不使用异步调用也是如此。它将启用同时读取和写入,并使读取和写入可取消(干净地)。

你只需要一个单独的线程来阅读。如果您想要一个完全异步的库,还可以选择通过消息队列编写另一个。

关于c++ - 串行端口线程的 CPU 消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27509750/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com