(转)使用AfxGetMainWnd函数的一个心得
来源:http://blog.csdn.net/clever101/
使用AfxGetMainWnd函数获取MFC程序中的主框架类指针是一个常用作法。但是你会发现这一做法有时也会失灵。不信, 你测试一下下面的代码:
- unsigned __stdcall SecondThreadFunc( void* pArguments )
- {
- CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
- if (NULL!=pMainWnd)
- {
- CView *pView = pMainWnd->GetActiveView();
- if (NULL!=pView)
- {
- CDC *pDC = pView->GetDC();
- ASSERT(NULL!=pDC);
- pDC->TextOut(100,100,_T("来自线程的字符串"));
- pView->ReleaseDC(pDC);
- }
- }
- return 0;
- }
- void CMainFrame::OnTest1()
- {
- // TODO: 在此添加命令处理程序代码
- HANDLE hThread;
- unsigned threadID;
- hThread = (HANDLE)_beginthreadex( NULL, 0, &SecondThreadFunc, NULL, 0, &threadID );
- // Destroy the thread object.
- CloseHandle( hThread );
- }
运行OnTest1函数,你会发现客户区并没有打印"来自线程的字符串"。下面我们把线程函数变一下:
- unsigned __stdcall SecondThreadFunc( void* pArguments )
- {
- // CMainFrame* pMainWnd = (CMainFrame*)AfxGetMainWnd();
- COwnerApp *pApp = (COwnerApp *)AfxGetApp();
- CMainFrame* pMainWnd = (CMainFrame*) pApp->m_pMainWnd;
- if (NULL!=pMainWnd)
- {
- CView *pView = pMainWnd->GetActiveView();
- if (NULL!=pView)
- {
- CDC *pDC = pView->GetDC();
- ASSERT(NULL!=pDC);
- pDC->TextOut(100,100,_T("来自线程的字符串"));
- pView->ReleaseDC(pDC);
- }
- }
- return 0;
- }
运行OnTest1函数,我们发现视图客户区出现了"来自线程的字符串"。接下来我们调试进去AfxGetMainWnd函数,发现AfxGetMainWnd函数如下:
- _AFXWIN_INLINE CWnd* AFXAPI AfxGetMainWnd()
- { CWinThread* pThread = AfxGetThread();
- return pThread != NULL ? pThread->GetMainWnd() : NULL; }
由于AfxGetThread()函数返回为NULL,所以AfxGetMainWnd函数返回为NULL。为什么会这样呢?下面我提出我的猜想(本人暂时验证不了,仅起抛砖引玉的作用)。我估计是MFC在多线程中大量运用了TLS(线程本地存储)来保存某些状态,主框架窗口指针属于主线程的TLS(线程本地存储)保存的状态,但是应用程序类指针不属于TLS保存的状态,它可以在该进程的任何线程获取。
(转)使用AfxGetMainWnd函数的一个心得的更多相关文章
- AfxGetMainWnd()函数用法
CWnd* AfxGetMainWnd( ); 使用AfxGetMainWnd函数获取MFC程序中的主框架类指针是一个常用作法. 就是获得应用程序主窗口的指针,AfxGetMainWnd()-> ...
- 用javascript 写个函数返回一个页面里共使用了多少种HTML 标签
今天我无意间看到一个面试题: 如何用javascript 写个函数返回一个页面里共使用了多少种HTML 标签? 不知你看到 是否蒙B了,如果是我 面试,肯定脑子嗡嗡的响.... 网上搜了搜也没有找到答 ...
- Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值
第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...
- Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列
11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...
- Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型
11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型 ...
- C++学习45 流成员函数put输出单个字符 cin输入流详解 get()函数读入一个字符
在程序中一般用cout和插入运算符“<<”实现输出,cout流在内存中有相应的缓冲区.有时用户还有特殊的输出要求,例如只输出一个字符.ostream类除了提供上面介绍过的用于格式控制的成员 ...
- 【转载】让c++ 函数返回一个数组
在c++中是不允许数组作为函数的返回值的 int [] someFunction( ); //ILLEGAL 要想实现函数返回一个数组,那返回对应数组里面类型的指针 you must return a ...
- js eval()函数 接收一个字符串,做为js代码来执行。 如: s='var d="kaka"'; 或者s=‘function (code){return code }’;
eval函数接收一个参数s,如果s不是字符串,则直接返回s.否则执行s语句.如果s语句执行结果是一个值,则返回此值,否则返回undefined. 需要特别注意的是对象声明语法“{}”并不能返回一个值, ...
- jQuery 函数位于一个 document ready 函数中
在我们的实例中的所有 jQuery 函数位于一个 document ready 函数中: $(document).ready(function(){ --- jQuery functions go h ...
随机推荐
- dataframe 合并(append, merge, concat)
https://www.cnblogs.com/guxh/p/9451532.html https://blog.csdn.net/zutsoft/article/details/51498026 写 ...
- django中templates阅读笔记
一.基本知识 1.模版是独立于django的,可以独立运行. 模版变量是用两个大括号括起来的字符串,表示变量.例如{{ person_name }} 模版标签,是用一对大括号和一对百分号括起来的,例如 ...
- CentOS配置本地yum源/阿里云yum源/163yuan源,并配置yum源的优先级
一.用Centos镜像搭建本地yum源 由于安装centos后的默认yum源为centos的官方地址,所以在国内使用很慢甚至无法访问,所以一般的做法都是把默认的yum源替换成aliyun的yum源或者 ...
- 配置 Sliverlight 跨域访问策略
Silverlight程序在访问非本域资源时,需要在相应的域根目录下建立跨域访问策略文件才能进行访问. 文件名:clientaccesspolicy.xml 文件内容: <?xml versio ...
- jquery实现仿京东侧边栏
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- VC++ 遍历目录
遍历文件目录,即把一个目录里的文件名都取出来.本文是CFileFind类的使用实例的笔记.下面的程序是从一个目录出发,把这个目录里的所有成员按着层次输出. 代码如下: void TravelFolde ...
- gtk-gnash大量占用cpu解决办法
http://blog.csdn.net/papenghan/article/details/7727955 gnash是一个firefox的flash插件版本.当使用firefox打开含有falsh ...
- 处理oracle 报ORA-12505 信息:listener does not currently know of SID given in connect descriptor...
oracle 的 sql developer连接不上问题: sql developer连接本机的服务器时,有时候能连接,有时候连接不上,什么原因造成的呢? ①检查oracle服务器和监听器是否已经启动 ...
- 一款纯css3实现的机器人看书动画效果
今天要给大家介绍一款纯css3实现的机器人看书动画效果.整个画面完全由css3实现的绘制,没有使用任何图片元素.机器人的眼睛使用了动画元素.我们一起看下效果图: 在线预览 源码下载 实现的代码. ...
- linux命令--vi,vim
进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件.并将光标置于第n行首 vi + filename :打开文件.并将光标置 ...