MFC最好不要在子线程中操控界面上的控件

今天遇到一个bug,烦了我大半天。最后在QQ群中有人给我指出来了。感觉白费了很多时间。

我在一个窗口的某条信息处理函数中new了一个进度条控件对象。然后创建一个子线程,然后在子线程中delete这个控件对象。没想到每到这个delete的地方,程序就会崩溃。

提示:Debug Assertion Failed! xxx.exe

FIle:xxx.cpp

LINE:1019

 

For information on how your program can cause an assertion failure,see the Visual ...

 

我开始以为是内存越界或多次释放问题。断点跟踪的情况却说明指针和指针指向的值都是对的。为什么就不能delete呢?

现在才知道是不能在子线程中操控控件。正确的做法应该是在子线程中发送消息给窗口。让界面线程自己管理界面。

 

粘贴一下在网上搜的的解释:(还是不懂额,谁能解释一下)

不要在线程函数体内操作MFC控件,因为每个线程都有自己的线程模块状态映射表,在一个线程中操作另一个线程中创建的MFC对象,会带来意想不到的问题。更不要在线程函数里,直接调用UpdataData()函数更新用户界面,这会导致程序直接crash。而应该通过发送消息给主线程的方式,在主线程的消息响应函数里操作控件。

你可能感兴趣的:(MFC最好不要在子线程中操控界面上的控件)