C ++ MFC处理器线程滞后

时间:2016-02-03 16:41:26

标签: c++ multithreading mfc

我正在尝试调试C ++ MFC Windows服务应用程序,因为我们发现在高强度环境中,在接收和处理第三方消息之间会出现延迟。

该服务侦听来自第三方系统的已接收消息。在接收到消息时,它将消息传递给专用处理线程,该线程执行命令的所有处理。如前所述,问题在于我们看到收货和处理存在明显滞后。我们可以看到这一点,因为所有消息都包含序列号。例如,我们的跟踪报告主线程在13:00:00收到序列号为867的消息,但是我们在13:00:38之前没有看到来自处理线程的相应跟踪(这是一个实时系统,理想情况下它会是瞬间的。)

我还可以在跟踪中看到,在正常系统上我们会看到一个清晰的Receipt-Process-Receipt-Process-Recepit-Process等序列.....在这个日志中我们有一个4块或5个收据消息,然后是4或5个过程消息,然后是另外4或5个收据消息,依此类推。由于它们在不同的线程上运行,这让我感到惊讶,因为我希望看到散布的痕迹,即使延迟了。

在代码中,有一个类似的消息映射:

BEGIN_MESSAGE_MAP(CProcessorThread, CWinThread)
ON_THREAD_MESSAGE(WM_MSG_RCV, OnReceive)
END_MESSAGE_MAP()

线程类看起来像这样(略有删节):

class CProcessorThread : public CWinThread {
protected:
    DECLARE_MESSAGE_MAP()
private:
    CAMProcessingObject *obj;

    afx_msg void OnReceive(WPARAM wParam, LPARAM lParam) {
        CString* strRecData = (CString*)wParam;
        CString& sTemp = *strRecData;

        // Various checks and filters are done here
        if (true) {
            obj->ProcessMessage(sTemp);
        }

        delete strRecData;
    }
}

以下是最初从第三方系统接收消息的方法(同样,删节):

DWORD WINAPI CAMReceiving::ThreadReceive( void * args) {
    CAMObject * camObject = (CAMObject *) args;
    char chTemp[500];
    while(true) {

        // Get the message from the socket
        memset(chTemp, 0, sizeof(chTemp));
        iRecvLen = camObject->objsocket.ReceiveData(chTemp, sizeof(chTemp) - 1);    

        CString strEventNotification = _T("");

        // Do various processing to populate the strEventNotification CString and make sure we want to process this message

        CString* strEvent = new CString(strEventNotification);
        processorThread.PostThreadMessageA(WM_MSG_RCV,(WPARAM)strEvent,0);
        continue;
    }
    return 1;
}

因为你可能会说我没有写这个并且我不熟悉C ++中的多线程方法,所以我的问题是这个设计真的存在根本错误吗?或者有什么我不知道会在这里引起我的问​​题?提前谢谢!

0 个答案:

没有答案