MFC多线程编程,在子线程中使用对话框控件变量和成员的方法

大家好!本人是一名刚学MFC的新手,如有一些描述不清的地方请大家多多包涵,谢谢!

一般来说MFC编程时在子线程中是无法直接使用控件变量的,而在子线程中在使用:

CAddThreadDlg *pDlgWnd = (CAddThreadDlg*)pParam;

就可以解决这一问题,如:

UINT ThreadProcA(LPVOID pParam) //线程的实现
{
	CAddThreadDlg *pDlgWnd = (CAddThreadDlg*)pParam;//此功能可以调用主对话框定义的类成员函数
	CRect rect;//声明一个CRect类的对象(一个矩形框)
	pDlgWnd->m_picture.GetWindowRect(rect);//m_picture是Picture Control添加的变量
	
	CWnd*pwnd = pDlgWnd->GetDlgItem(IDC_PICTURE);
	CClientDC dc(pwnd);
	...
	}

但是,像我之前一样,很多人在开始调试时会出现程序中断的现象!!!
在这里插入图片描述
而且在编译时在代码:
**pDlgWnd->m_picture.GetWindowRect(rect);//m_picture是Picture Control添加的变量**
处会发生编译中断。我在网上找了许久,一直没有解决这个问题。后来是在一个视频里面看到的解决办法!

解决办法

在MSDN中 AfxBeginThread()函数的定义如下:

CWinThread* AfxBeginThread(
    AFX_THREADPROC pfnThreadProc,
    LPVOID pParam,
    int nPriority = THREAD_PRIORITY_NORMAL,
    UINT nStackSize = 0,
    DWORD dwCreateFlags = 0,
    LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);

后来得知问题是出在创建线程函数时参数的传递:
1.错误的实例:

g_pThread = AfxBeginThread(ThreadProcA, NULL);

2.正确的方法是在第二个参数传递this指针,指向Dlg对话框:

g_pThread = AfxBeginThread(ThreadProcA, this);

通过这样就得到了完美的解决!!!

本人第一次写文章,如有不对的地方希望大家多多指出!如果觉得有帮助的话请给我点个赞,谢谢大家!
如需完整的代码请查看:https://download.csdn.net/download/a909988197/12549599
这是我昨天上次的,谢谢大家的支持!

猜你喜欢

转载自blog.csdn.net/a909988197/article/details/106959393