MFC多线程原始数据查看器程序设计



我正在处理的程序具有以下功能:

  • 显示传入数据(通过以太网UDP套接字(
  • 操作和计算标题和显示中的一些数据
  • 根据用户输入保存帧数

程序具有以下结构:

  • 运行的主UI线程(由MFC提供(
  • 一个线程,它将对话框本身this作为参数,并负责通过UDP套接字接收数据
  • 一个线程,它还接受对话框指针this,并负责显示数据

数据接收线程使用缓冲区来存储数据,该缓冲区是对话框类的成员。使这成为可能的是,在显示线程中,我可以使用对话框指针访问存储在缓冲区中的数据并显示它;例如StretchBlt(…..,pdlg->vbuf[0].data,…..(;。

这真的没什么复杂的。程序运行平稳,直到有用户输入(窗口消息或更多(。它在以下位置崩溃:

  1. 最频繁的崩溃点

CEXAMPLEAPP::InitInstance()
{
...
CEXAMPLEDlg* pdlg = new CEXAMPLEDlg;
m_pMainWnd = pdlg;
INT_PTR nResponse = pdlg->DoModal(); <--------------------------------------------
if( pdlg!=NULL )
{
delete pdlg;
m_pMainWnd = NULL;
}
...
}

nRespone有一个huuuuge负值(大约是小数点后19度(,我认为这不是正常行为。

  1. 它也在几个不同的位置崩溃。其中大多数是读取违规或dll错误,很难解释和跟踪原因

我做了一些研究,崩溃的可能原因是:

i( 动态分配的对话框对象是本地的。因此,分配的内存不足以处理无限传入的数据。这就是为什么它会在随机位置造成阅读违规。

ii(另一个可能的原因是,包括帧缓冲区在内的大多数变量都是成员变量——程序使用两个独立的工作线程,并且它们都将对话框指针作为参数。即使对缓冲区例程的读取和写入是在线程函数(全局(中的CCcriticalSection lock((和unlock((中完成的,但变量的所有权可能是原因。

这就是我现在的处境。有什么办法修复这些崩溃吗?对使用这些变量作为对话框类的成员变量有什么想法吗?

  • 线程通过SetEvents((和WaitforSingleObject((进行通信

当您在显示线程中显示数据(StretchBlt(....., pdlg->vbuf[0].data, ....);(并且这是在访问显示DC时,您必须确保与主线程同步执行,例如,使用原子锁。或者,作为一个更好的解决方案,在主线程中进行显示,然后完全删除显示线程。

最新更新