如何就delete出错了?delete一个CProgressCtrl控件对象导致崩溃
怎么就delete出错了?delete一个CProgressCtrl控件对象导致崩溃
我先new了一个CProgressCtrl对象,然后在一个线程函数中释放它导致崩溃。
用到的结构体
然后在线程函数中
我实在不知道为啥?发现在把new和delete放在同一个函数中是没有问题的。
------解决方案--------------------
给个建议,打印一下这俩个指针的地址,看看他们指向的地址是不是一样的。。。
虽然对这个东西不熟,但是总之先看看现象吧。
------解决方案--------------------
只要和界面想关的或者调用的函数里处理了界面想干的 就不要跨线程 都是通过发消息的方式
------解决方案--------------------
要传:
控件的 hWnd, 才安全。
------解决方案--------------------
一个控件对象包含2个部分:数据和窗口(数据成员里的句柄标识窗口)。删除对象也分为两步,先销毁窗口,然后删除数据。普通线程不能操作执行任何和窗口相关的工作。具体原因我也没找到一个好的说法。
------解决方案--------------------
可以试试发送消息让控件自己销毁窗口,然后在线程中delete就应该没问题
我先new了一个CProgressCtrl对象,然后在一个线程函数中释放它导致崩溃。
用到的结构体
struct PAR_TO_PROTHREAD{
CProgressCtrl* pPro;
TCHAR *filename;
};
afx_msg LRESULT CUpDownDlg::OnUp(WPARAM wParam, LPARAM lParam)
{
TCHAR *filename = (TCHAR*)wParam;
CProgressCtrl *upPross = new CProgressCtrl;
upPross->Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,CRect(10,10,200,30),this,134);
PAR_TO_PROTHREAD *par = new PAR_TO_PROTHREAD;
memset(par,0,sizeof(PAR_TO_PROTHREAD));
par->pPro = upPross;
par->filename = filename;
CreateThread(NULL,0,UpDownProThreadFunc,(LPVOID)par,0,NULL);
return 0;
}
然后在线程函数中
DWORD WINAPI UpDownProThreadFunc(LPVOID lpParam)
{
PAR_TO_PROTHREAD *par = (PAR_TO_PROTHREAD*)lpParam;
CProgressCtrl *pro = par->pPro;
TCHAR *filename = par->filename;
//。。。
delete pro; //一到这句就崩溃,不知为什么?
delete[] filename;
delete par;
我实在不知道为啥?发现在把new和delete放在同一个函数中是没有问题的。
------解决方案--------------------
给个建议,打印一下这俩个指针的地址,看看他们指向的地址是不是一样的。。。
虽然对这个东西不熟,但是总之先看看现象吧。
------解决方案--------------------
只要和界面想关的或者调用的函数里处理了界面想干的 就不要跨线程 都是通过发消息的方式
------解决方案--------------------
要传:
控件的 hWnd, 才安全。
------解决方案--------------------
一个控件对象包含2个部分:数据和窗口(数据成员里的句柄标识窗口)。删除对象也分为两步,先销毁窗口,然后删除数据。普通线程不能操作执行任何和窗口相关的工作。具体原因我也没找到一个好的说法。
------解决方案--------------------
可以试试发送消息让控件自己销毁窗口,然后在线程中delete就应该没问题