【问题标题】:CPU comsuption with Serial Port Thread串行端口线程的 CPU 消耗
【发布时间】:2014-12-16 16:49:54
【问题描述】:

我编写了我的专业应用程序,但串行端口线程有一个问题。 我有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 运行的问题,但我没有找到解决方法。 (经过表演和其他工具) 你有什么想法吗?

谢谢

【问题讨论】:

  • 您的问题是内存泄漏还是 CPU 消耗?或两者 ?你说的是内存泄漏,但描述的是 CPU 消耗。
  • 请先尝试缩小您的问题范围。粘贴所有代码并不能帮助您解决问题。
  • 对不起CPU消耗错误翻译。
  • @Matt 我编辑了只保留功能障碍代码。我的问题是,当我添加时,我的 CPU 消耗变为 100%。

标签: c++ multithreading memory-leaks


【解决方案1】:

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

你可以做什么:

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

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

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

IO 线程应该总是在某个地方等待。它可以在像ReadFile() 这样的阻塞 IO 调用上,也可以在 Windows 可等待对象上。

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

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

【讨论】:

  • 谢谢。那里有一个你特别推荐/你经常使用的库?
  • @Boz 通常我使用自己的包装器。我不介意你是否使用它,所以这里有一个到.cpp 的链接,以及一个到.hpp 的链接。我对其进行了一些修改以供您使用,并在 .cpp 末尾添加了一个最小示例(main())。我只是在修改后做了一个快速测试,所以如果有什么问题,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-06
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多