在另一个线程中无法用((CMainFrame *)AfxGetMainWnd())
一个vc6的项目放到vc8下重新编译这里死活过不去 查了些资料无果后来翻到一句老外的回答
If AfxGetMainWnd is called from the application’s primary thread, it returns the application’s main window according to the above rules. If the function is called from a secondary thread in the application, the function returns the main window associated with the thread that made the call.
大概意思就是说在子线程里面调用AfxGetMainWnd()返回的是和当前线程相关联的窗体句柄而不是当前程序的主窗体句柄。不知道这是不是vc8的一个改变,也没时间去细查。
解决方法1:
CWnd* m_pCWnd = NULL;
在OnInitDialog里 m_pCWnd = AfxGetMainWnd();
解决方法2:
调用AfxGetMainWnd()的地方替换成AfxGetApp()->m_pMainWnd
编译后运行问题解决
我用方法2解决问题。
AfxGetMainWnd()得到的是当前线程的主窗口(如果有的话).
因为主窗口是属于主线程的,所以想得到主窗口HWND值,
只能在主线程中用AfxGetMainWnd(),但要不是处在主线程中,
AfxGetMainWnd()可能是从当前线程查询主窗口的。但好像
AfxGetMainWnd()不能跨线程,故要出错.要想在线程中使用
主窗口的HWND值,可以把主窗口的HWND值传给线程.也
可以用AfxGetApp()先取得主线程,再通过CWinThread的类成
员m_pMainWnd获得主窗口(AfxGetApp()->m_pMainWnd->m_hWnd)
If AfxGetMainWnd is called from the application's primary thread,
it returns the application'smain window according to the above rules.
If the function is called from a secondary thread in the application,
the function returns the main window associated with the thread that made the call.
今天好像找到原因了~ 我那个线程是用CreateThread创建的,而 CreateThread是由
操作系统提供的接口,在 CreateThread创建的线程中用MFC的函数AfxGetMainWnd()会有问题.
如果用MFC编程,不要用CreateThread,如果只是使用Runtime Library,用
_BeginThread,总之,不要轻易使用CreateThread
这是因为在MFC和RTL中的函数有可能会用到些它们所封装的公用变量,也就是
说AfxBeginThread和_BeginThread都有自己的启动代码是CreateThread所没有的
在用CreateThread所创建的线程中使用MFC的类和RTL函数就有可能出现问题
如果你是用汇编编写win32程序并且在线程函数中也不调用MFC和RTL的函数,那用
CreateThread就没问题,或者你虽然是用C写线程函数,但你很小心没调用RTL函数
也不会有问题
CreateThread是由操作系统提供的接口,而AfxBeginThread和_BeginThread则是编译
器对它的封装
在另一个线程中无法用((CMainFrame *)AfxGetMainWnd())的更多相关文章
- spring事务 将多个connection放到一个线程中
spring事务 将多个connection放到一个线程中
- (未使用AOP)使用ThreadLocal对象把Connection和当前线程绑定, 从而使一个线程中只有一个能控制事务的对象
每个连接都有自己的独立事务,会造成数据的不一致 这组操作应该要么一起操作成功,要么一起操作失败, 应该使用同一个连接,只有一个能控制事务的对象 需要使用ThreadLocal对象把Connection ...
- 一个线程中lock用法的经典实例
/* 该实例是一个线程中lock用法的经典实例,使得到的balance不会为负数 同时初始化十个线程,启动十个,但由于加锁,能够启动调用WithDraw方法的可能只能是其中几个 作者:http://h ...
- WinForm,在另一个线程中更新Form中的数据(转)
Form本身有线程,但对于一些耗时的操作,我们不希望在Form的线程中进行,因为会导致Form线程阻塞,产生假死的现象. 其他线程中操作Form中的控件,总出现“线程间操作无效: 从不是创建控件的线程 ...
- qt数据库多线程问题的解决(QSqlDatabase只能在创建它的线程中使用)
Qt数据库由QSqlDatabase::addDatabase()生成的QSqlDatabase只能在创建它的线程中使用, 在多线程中共用连接或者在另外一个线程中创建query都是不支持的几乎国内没有 ...
- 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---干净的终止一个线程
干净的终止一个线程 我曾经在第2章产生一个后台线程,用以输出一张屏幕外的 bitmap 图.我们必须解决的一个最复杂的问题就是,如果用户企图结束程序,而这张bitmap 图尚未完成,怎么办?第2章的 ...
- C++线程中的几种锁
线程之间的锁有:互斥锁.条件锁.自旋锁.读写锁.递归锁.一般而言,锁的功能越强大,性能就会越低. 1.互斥锁 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量.也就是说是为了避免多个线程在 ...
- 重点:怎样正确的使用QThread类(很多详细例子的对比,注意:QThread 中所有实现的函数是被创建它的线程来调用的,不是在线程中)good
背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...
- Android中进程与线程及如何在子线程中操作UI线程
1. Android进程 一个应用程序被启动时,系统默认创建执行一个叫做"main"的线程.这个线程也是你的应用与界面工具包(android.widget和android.view ...
随机推荐
- netbeans8.2下struts2的Java Web开发Demo1
struts2框架主要是封装了servlet,简化了jsp跳转的复杂操作,并且提供了易于编写的标签,可以快速开发view层的代码. 过去,我们用jsp和servlet搭配,实现展现时,大体的过程是: ...
- hdu 5685(逆元)
Problem A Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- LeetCode OJ-- Letter Combinations of a Phone Number ***
https://oj.leetcode.com/problems/letter-combinations-of-a-phone-number/ 使用递归,深搜,使用 map 保存已经处理过的结果 cl ...
- Codeforces 899 B.Months and Years
B. Months and Years time limit per test 1 second memory limit per test 256 megabytes input standar ...
- 【WEB基础】HTML & CSS 基础入门(8)表单
前面 前面我们已经熟悉了网页上一些常见的元素,如在网页上显示一段文字.一张图片.一个列表.一张表格等等.这些东西都是事先编辑好显示在页面上只提供给用户看的,实际上,我们可以把这样的页面称之为静态页面. ...
- 10.1综合强化刷题 Day2 morning
一道图论神题(god) Time Limit:1000ms Memory Limit:128MB 题目描述 LYK有一张无向图G={V,E},这张无向图有n个点m条边组成.并且这是一张带权图,只有 ...
- Light oj 1125 - Divisible Group Sums (dp)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1125 题意: 给你n个数,q次询问,每次询问问你取其中m个数是d的整数倍的方案 ...
- eclipse 重构代码自动抽取函数
1.选择重构代码段 2.重构 – 抽取方法 3.命名重构代码段抽取的方法 4.使用抽取的方法
- mysql-实现远程连接(授权法)
远程连接阿里云主机的mysql,遇到以下问题: 1.连接被拒,无法连接 可能原因:1.3306(默认)端口未开放,在控制台设置防火墙规则: 2. host字段的值改为%就表示在任何客户端机器上能以ro ...
- 从Android动画到贝塞尔曲线
基础知识: 动画通过连续播放一系列画面,给视觉造成连续变化的图画.很通俗的一种解释.也很好理解.那么我们先来一个案例看看. 动画案例:百度贴吧小熊奔跑 效果: topic.gif 代码: <?x ...