我正在处理的程序具有以下功能:
- 显示传入数据(通过以太网UDP套接字(
- 操作和计算标题和显示中的一些数据
- 根据用户输入保存帧数
程序具有以下结构:
- 运行的主UI线程(由MFC提供(
- 一个线程,它将对话框本身this作为参数,并负责通过UDP套接字接收数据
- 一个线程,它还接受对话框指针this,并负责显示数据
数据接收线程使用缓冲区来存储数据,该缓冲区是对话框类的成员。使这成为可能的是,在显示线程中,我可以使用对话框指针访问存储在缓冲区中的数据并显示它;例如StretchBlt(…..,pdlg->vbuf[0].data,…..(;。
这真的没什么复杂的。程序运行平稳,直到有用户输入(窗口消息或更多(。它在以下位置崩溃:
- 最频繁的崩溃点
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度(,我认为这不是正常行为。
- 它也在几个不同的位置崩溃。其中大多数是读取违规或dll错误,很难解释和跟踪原因
我做了一些研究,崩溃的可能原因是:
i( 动态分配的对话框对象是本地的。因此,分配的内存不足以处理无限传入的数据。这就是为什么它会在随机位置造成阅读违规。
ii(另一个可能的原因是,包括帧缓冲区在内的大多数变量都是成员变量——程序使用两个独立的工作线程,并且它们都将对话框指针作为参数。即使对缓冲区例程的读取和写入是在线程函数(全局(中的CCcriticalSection lock((和unlock((中完成的,但变量的所有权可能是原因。
这就是我现在的处境。有什么办法修复这些崩溃吗?对使用这些变量作为对话框类的成员变量有什么想法吗?
- 线程通过SetEvents((和WaitforSingleObject((进行通信
当您在显示线程中显示数据(StretchBlt(....., pdlg->vbuf[0].data, ....);
(并且这是在访问显示DC时,您必须确保与主线程同步执行,例如,使用原子锁。或者,作为一个更好的解决方案,在主线程中进行显示,然后完全删除显示线程。