网站公告列表

  没有公告

加入收藏
设为首页
联系我们
您现在的位置: 山东在线 >> 生活百问 >> 电脑互联网 >> 软件开发 >> 正文
  MFC多线程编程注意事项 --软件研发           
MFC多线程编程注意事项 --软件研发
作者:佚名 文章来源:不详 更新时间:2008-6-19 16:03:26
关于启动线程时传输窗口对象(指针?句柄?)的问题:

在选择菜单中的开始线程后:
void cmainframe::onmenu_start()
{
...
afxbeginthread(mythread, this);
...
}

线程函数如下:
uint mythread(lpvoid pparam)
{
cmainframe* pmainfrm = (cmainframe *)pparam;
...
}

问题一:
这样的代码是不是有问题?
(文档中说线程间不能直接传输mfc对象的指针,应该通过传输句柄实现)

问题二:
这样使用开始好像没有问题,直接通过pmainfrm访问窗口中的view都正常。
但发现访问状态条时:
pmainfrm->m_wndstatusbar.setpanetext(2, "test);
出现debug assertion failed!(在窗口线程中没有问题)
位置是wincore.cpp中的
assert((p = pmap->lookuppermanent(m_hwnd)) != null ||
(p = pmap->lookuptemporary(m_hwnd)) != null);
为什么访问view能正常,但访问状态条时不可以呢?

问题三:
如果通过传输句柄实现,怎样做呢?
我用下面的代码执行时有问题:
void cmainframe::onmenu_start()
{
...
hwnd hwnd = getsafehwnd();
afxbeginthread(mythread, hwnd);
...
}

uint mythread(lpvoid pparam)
{
cmainframe* pmainfrm = (cmainframe *)(cwnd::fromhandle((hwnd)pparam));
...
}
执行时通过线程中得到pmainfrm,访问其成员时不正常。

网友:hewwatt
大致原因解释如下:
1. mfc的大多数类不是线程安全的,cwnd及其消息路由是其中之最
2. mfc界面类的大多数方法,最后都是通过sendmessage实现的,而消息处理的
过程中会引发其他消息的发送及处理。如果消息处理函数本身不是线程安全的
你从工作线程中调用这些方法迟早会同你界面线程的用户消息响应发生冲突
3. cxxxx::fromhandle会根据调用者所在线程查表,如果查不到用户创建的cxxxx
对应对象,它会创建一个临时对象出来。由于你在工作线程中调用该方法,当然不可能查到界面主线程中你所建立起来的那个对象了。这时mfc会你创建一个临时对象并返回给你,你根本不可能期望它的成员变量会是有意义的。

所以要用也只能用cwnd::fromhandle,因为它只包含一个m_hwnd成员。 不过,要记住
跨线程直接或间接地调用::sendmessage,通常都是行为不可预测的。

更详细信息,请点击查看原文。
李世平的专栏 - CSDNBlog
文章录入:admin    责任编辑:admin 
  • 上一篇文章:

  • 下一篇文章:
  • 你可能想要关注的其它信息
     喝茶有什么好处
     各种不同的水果对人体分别有哪些…
     什么东西含钙最高
     大豆及其制品的营养特点
     怎样可以胖点?
     吃香蕉到底是会发胖还是减肥
     哪些食物是碱性的
     西红柿减肥的时候能吃么
     饭后最该知道的几件事
     加班熬夜族的饮食误区
     盲目进补对身体有害无益
     滋润食疗做个水嫩女人
     过完肥年也可不增肥
     一周在外就餐7次有生命危险
     吃到意犹未尽时最健康
     十种食物给你好睡眠
     女性贫血的经典食疗方
     蔬菜煮熟食用更有营养
     血型不同饮食也不同
     完美胸形 用食品缔造…
     男子性福八种药膳做法(组图)
     比营养比热量,馒头米饭大PK
     吃什么不得高血脂?
     防感冒喝点果汁醋
     一周在外就餐7次有生命危险(图)
     七种最难留住的营养
     冬季进补,百变不离汤水(图)
     男女冬季健康饮食大全(组图)
     “抗癌蔬菜排行榜”谁是冠军?
     不同颜色水果有不同功效 橘色提高免疫力…
     心血管病人多吃三种食物
     牛奶加糖煮会引起腹泻
     巧用牛奶来“食疗”
     7 个喜爱巧克力的理由(图)…
     给头发吃点水果
     眼疾患者“食疗菜单”(图)
     一个具攻击性的年轻人食谱(图)
     给“错误食物搭配”平反(图)
     【破竹寺】直观体验装备转档规则
     大话作坊你了解多少
     小编推荐:帐号防盗攻略
     『客栈新闻』新五环-新体会
     打造大闹,重铸经典
     大话每天必做二三事之新人必看
     有关各类“暴点”汇总
     如何炼造血攻女人
     4大攻法宠
     6坐骑有鸡肋存在吗?
    【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    专 题 栏 目
    最 新 热 门
    相 关 文 章
    30岁IT人价值在哪里?-软…
    程序结构中的两点重要元…
    企业信息化:用IT解决沟…
    从中国男足看项目管理 -…
    WebSphere 多媒体课件:…
    解析分布式访问控制方法…
    UML(统一建模语言)死亡的…
    恼人不休的问题:什么是…
    DSL:单一语言开发的终结…
    回顾成长历程,顿悟思考…
    山东在线 Copyright@2006-2008 鲁ICP备07018514号 中国网通集团公司山东省分公司