【多线程与AfxGetMainWnd & 窗口 与 线程 有必然联系吗? & 命名空间】


【多线程与AfxGetMainWnd & 窗口 与 线程 有必然联系吗? &  命名空间】

笔记内容:

转载自:http://blog.csdn.net/linyaoxin/article/details/4847529

《多线程与AfxGetMainWnd的吐血遭遇……》

事情开始有点眉目了,似乎是开始多线程以后再调用::AfxGetMainWnd()->SetWindowText就会发生崩溃,但是为啥之前VC6里死活没问题?找了半天资料没答案,最后很幸运的在某个站点看到一个全英文回答:

If AfxGetMainWnd is called from the application's primary thread, itreturns the application's main window according to the above rules. If thefunction is called from a secondary thread in the application, the functionreturns the main window associated with the thread that made the call.

在多线程里调用AfxGetMainWnd返回的是与线程有关联的主窗体?但是我这程序只有一个窗体,但是它仍然崩溃,差不多明白了,多线程里获得的句柄不等于真正的窗体句柄,对这个句柄进行“非法写操作”,于是崩溃了……

 

// "多线程里获得的句柄不等于真正的窗体句柄",这句话不理解?

// 有多个窗口,多个线程,此时,各个线程中调用 AfxGetMainWnd() 返回的是什么呢? 

// 有一个窗口,多个线程,此时,各个线程中调用 AfxGetMainWnd() 返回的又是什么呢? Trylater。

// 窗口 与 线程 有必然联系吗?

 

了解了症状就好办了,在全局里写一个窗口句柄类变量
CWnd* m_pCWnd;

然后在初始化过程OnInitDialog里加上
m_pCWnd = AfxGetMainWnd();

// 这里为什么不用命名空间限定符,即 m_pCWnd = ::AfxGetMainWnd();

以后要写窗体标题的时候就用m_pCWnd->SetWindowText,将程序里所有AfxGetMainWnd改为m_pCWnd,重新编译运行,终于不再崩溃了!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多线程的Socket通讯MFC是指使用MFC框架实现多线程的Socket通讯。在MFC中,可以使用CWinThread类来创建多线程程序,使用CSocket类实现Socket通讯。 具体步骤如下: 1. 创建一个主线程,并创建一个Socket对象。 2. 创建一个CWinThread对象,并在该对象的函数体中创建一个Socket对象。 3. 启动CWinThread对象,该对象将在新线程中执行。 4. 在主线程中使用Socket对象发送数据。 5. 在新线程中使用Socket对象接收数据。 6. 在接收到数据后,可以使用PostMessage函数将数据发送给主线程进行处理。 7. 在程序结束时,需要关闭所有Socket对象,并退出所有线程。 示例代码如下: //主线程 CSocket m_socket; void CMainFrame::OnSendData() { CString strData = "Hello World!"; m_socket.Send(strData, strData.GetLength()); } //新线程 class CMyThread : public CWinThread { public: virtual BOOL InitInstance(); virtual int ExitInstance(); DECLARE_DYNCREATE(CMyThread) }; IMPLEMENT_DYNCREATE(CMyThread, CWinThread) BOOL CMyThread::InitInstance() { CSocket m_socket; m_socket.Create(); m_socket.Connect("127.0.0.1", 8080); char buf[1024]; int len = m_socket.Receive(buf, 1024); buf[len] = '\0'; CString strData = buf; AfxGetMainWnd()->PostMessage(WM_USER_RECEIVEDATA, (WPARAM)&strData, 0); m_socket.Close(); return TRUE; } int CMyThread::ExitInstance() { return CWinThread::ExitInstance(); } void CMainFrame::OnStartThread() { CMyThread* pThread = (CMyThread*)AfxBeginThread(RUNTIME_CLASS(CMyThread)); } void CMainFrame::OnReceiveData(CString* pData) { MessageBox(*pData); } void CMainFrame::OnClose() { m_socket.Close(); CFrameWnd::OnClose(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值