串行端口线程的CPU消耗

时间:2014-12-16 16:49:55

标签: c++ multithreading memory-leaks

我写了专业的应用程序,串口线程有一个问题。 我有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运行哪个问题,但我没有找到如何解决它。 (演出后和其他工具) 你有点想法吗?

谢谢

1 个答案:

答案 0 :(得分:0)

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

你能做什么:

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

有人建议制作自己的串口包装器:

有关Windows上串行端口的所有信息,请访问:Serial Communications

IO线程应始终在某处等待。它可以是阻塞的IO调用,如ReadFile(),也可以是Windows等待对象。

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

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