我正在尝试调试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 ++中的多线程方法,所以我的问题是这个设计真的存在根本错误吗?或者有什么我不知道会在这里引起我的问题?提前谢谢!