使用串行端口线程进行 CPU 支持
CPU comsuption with Serial Port Thread
我写了我的专业应用程序,我的串口线程有一个问题。我有 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
串行控制.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();
}
我想这是串行线程运行的问题,但我没有找到如何解决它。(在性能和其他工具之后(你有什么想法吗?
谢谢
我看了一下你的代码,不幸的是问题来自你正在使用的库/项目。基本上,多合一线程只是循环,从不等待任何地方,这会导致 100% 的 CPU 消耗。
你能做什么 :
- 在
run()
方法的内部while
循环末尾添加一个Sleep(1-10)
。这种方法是最糟糕的,它只是修补了潜在的问题。 - 使用另一个设计更好的库。
- 制作适合您使用的自己的库。
一些建议制作自己的串行 com 包装器:
您需要了解的有关Windows上串行端口的所有信息都在这里:串行通信。
IO 线程应始终在某个位置等待。它可以在阻塞 IO 调用(如 ReadFile()
(上,也可以在 Windows 可等待对象上。
如果可以,请使用重叠 IO,即使不使用异步调用也是如此。它将支持同时读取和写入,并使读取和写入可取消(干净(。
您只需要一个单独的线程即可读取。如果你想要一个完全异步的库,可以选择通过消息队列写入另一个。
相关文章:
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何禁用 CPU 的无序执行
- 您选择的 CPU 不支持 x86-64 指令集
- 强制 Dlib python 仅使用 CPU 支持进行安装;在具有 Cuda 和所有内容的 GPU 机器上
- 如何在新CPU上利用AVX2,同时支持旧CPU?
- 如何检测 CPU 是否支持英特尔防盗技术
- 使用串行端口线程进行 CPU 支持
- 根据可用的 CPU 支持使用不同的类
- 如何检查CPU是否支持SSE3指令集