`

关于多线程的一些细节

阅读更多
<meta content="MSHTML 6.00.2900.3199" name="GENERATOR"> <style></style>2001年09月24日 11:33:00

关于多线程的一些细节


作者: coolnerd


线程的程序中,如果线程要向界面窗口报告状态,有两种操作方法,
一种是通过消息的方法,由于消息本身携带的消息量有时不购用,往往消息参数
只是一个指向某消息对象的指针,而消息对象往往需要在堆内存中new生成,

(因为往往线程不能等待消息处理完毕就继续执行,所以如果消息对象是栈对象
往往消息对象还未来及被处理,就又被线程修改.所以采用堆对象.)

界面接受到
消息对象后delete之.但是这时界面退出后,如果线程仍然生成新的消息对象,
则消息对象得不到释放,所以在这种情况下,界面接受到WM_CLOSE消息将要释放
之前,要等待线程完全退出之后再真正释放.

线程向界面报告状态的第二种方法是直接在线程的执行过程中同步地(等待,
直到完成称为同步)执行界面显示,这种机制下,要注意在界面显示是需要查看
界面窗口是否仍然存在(使用IsWindow(hWnd)函数实现).
这样做似乎已经完美,但是是不完善的,因为假如有多个view小窗口,如多个
CSplitterWnd,只在一个CSplitterWnd的WM_CLOSE消息的处理函数中进行防范,
其他的CSplitterWnd照常退出,仍然要出问题,所以要抓住根源:

用户使用菜单退出或点击frmae窗口的x按钮退出,接受到退出消息的首先是frameWnd
所以需要在frameWnd的WM_CLOSE函数中进行线程的释放.!
另外,往往线程在Document类的掌管之下,frame怎样访问document对象?
FrameWnd没有直接提供获取document的函数.Document,View,FrameWnd三者的
创建顺序是:doc-<frmae-><br><big>可以执行以下代码: </big><br><big>CMainFrame*frm=(CMainFrame*)(AfxGetApp()-<m_pmainwnd><br><big>frm-<pdoc><br><big>另外:注意需要捕捉WM_CLOSE,而非WM_DESTROY消息,因为WM_CLOSE消息 </big><br><big>先于后者. </big><br><br><big>另外,考查以下代码: </big><br><big>void CThreadList::UpdateThread(int id,CString client,CString msg) </big><br><big>{ </big><br><big>EnterCriticalSection(&amp;CThreadList::csUpDateThread); </big><br><big>{ </big><br><big>int ItemCount=m_ListCtrl.GetItemCount() ; //ListCtrl</big><br><big>最多65535条记录 </big><br><big>if(id<itemcount><br><big>{ </big><br><big>for(int i=0;i&gt;id-ItemCount;i++) </big><br><big>{ </big><br><big>LV_ITEM lvi; </big><br><br><big>lvi.mask = LVIF_TEXT | LVIF_IMAGE</big><br><big>/* |LVIF_STATE */; </big><br><big>lvi.iItem = ItemCount+i; </big><br><big>lvi.iSubItem = 0; </big><br><big>m_ListCtrl.InsertItem(&amp;lvi); </big><br><big>//m_ListCtrl.SetItemCount(id); </big><br><big>} </big><br><big>} </big><br><br><big>m_ListCtrl.SetItemText(id-1,0,ito10a(id)); </big><br><big>m_ListCtrl.SetItemText(id-1,1,client); </big><br><big>m_ListCtrl.SetItemText(id-1,2,msg); </big><br><big>} </big><br><big>LeaveCriticalSection(&amp;CThreadList::csUpDateThread); </big><br><big>} </big><br><big>这就是线程用来调用的界面函数,该界面CThreadList </big><br><big>是个ListCtrl类,该成员函数的参数中,id,client,msg是界面显示的内容 </big><br><big>函数首先判断id是否超出现在已经存在的个数,如果超出则增加一到多条记录 </big><br><big>这种动态调整记录个数的机制比较诱人,但是如果这个函数是在这样的情况下 </big><br><big>被调用: frame窗口接受到了WM_CLOSE消息,在处理消息之前,首先消灭线程 </big><br><big>而就在消灭线程的过程中,一个未来及消灭的线程调用了这个函数,该函数在 </big><br><big>执行过程中需要执行GetItemCount()函数,跟踪GetItemCount函数,发现它是 </big><br><big>依靠执行SendMessage获得ItemCount的(SendMessage函数是个不等到结果不 </big><br><big>返回的函数),这时会发生的是死机,因为Windows系统在处理WM_ClOSE消息 </big><br><big>未完成时,又被要求处理SendMessage函数,于是SendMessage函数和WM_CLOSE </big><br><big>消息处理过程发生了互相等待的事故. </big><br><big>结论是不要在线程向界面报告状态的过程中调用任何依靠消息工作的函数. </big><br><big>经过考查,几乎所有更新界面控件的函数如SetItemText都是依靠SendMessage </big><br><big>来工作的,所以会到问题的最初:"在多线程的程序中,如果线程要向界面窗口 </big><br><big>报告状态,有两种操作方法"在这两种方法中,第二种方法是行不通的. </big><br><big>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.60.81] </big><br><br></itemcount></big></pdoc></big></m_pmainwnd></big></frmae->

>scrIPT language=JavaScript1.2 src="../article_bottom.js"

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=3537


分享到:
评论

相关推荐

    Vchome资料库--多线程技术篇(CHM)

    10 &lt;br/&gt;关于多线程的一些细节... 23 &lt;br/&gt;用VC++5.0 实 现 多 线 程 的 调 度 和 处 理... 25 &lt;br/&gt;一 多 任 务, 多 进 程 和 多 线 程... 25 &lt;br/&gt;二 基 于MFC 的 多 线 程 编 程... 26 &lt;br...

    Linux下多线程编程详解

    使用多线程的理由之一是和进程相比,它是一种非常"节俭"的多任务操作方式。我们知道,在Linux系统下,启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这是一种...

    同时多线程(SMT)

    同时多线程(SMT)的设计和实现细节的介绍; 是多核多线程体系结构的一个实现

    java 多线程设计模式 进程详解

    《JAVA多线程设计模式》PDF 下载 《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口...

    java socket 多线程 简易实现

    java socket 多线程 简易的实现方法 细节问题没有处理 适合新手

    vb多线程

    昨晚2:30的时候还没睡着,觉得有必要把vb编写多线程程序再次写一次;主要是以前忽略的细节和重要...想写多线程的朋友可以调试一下看看,关于多线程的任务模式,同步和互斥,临界资源和临界区(文中提到)欢迎跟帖讨论;

    QT 多线程同步QSemaphore

    QT QSemaphore实现了线程同步,详细细节请参考https://blog.csdn.net/qq_37529913?spm=1001.2101.3001.5113 博客QT多线程篇

    c#多线程线程池和异步编程

    我们将在这里进一步讨论一些.NET类,以及他们在多线程编程中扮演的角色和怎么编程。它们是:  System.Threading.ThreadPool 类  System.Threading.Timer 类  如果线程的数目并不是很多,而且你想控制每个线程的...

    JavaSE 多线程资料

    JavaSE 多线程资料 课程总结 概述 细节

    多线程程序设计

    多线程程序设计资料,讲述多线程设计应该注意的问题及细节等等!

    多线程代码测试DSL框架Awaitility.zip

    Awaitility 是多线程代码测试 DSL 框架,用于同步异步操作。测试异步系统很难,它不仅需要处理线程,超时和并发问题,代码测试意图也需在此类细节下隐藏。但 Awaitility 可让您简明传达对异步系统的期望,且操作...

    linux多线程编程

    LINUX下多线程编程入门提供,通过大量的例子讲授linux下如何进行多线程编程,和需要注意的地方细节

    qt http多线程断点续传下载v2.0(qt4 qt5均可用)

    该程序是一个Http单文件多线程 、 断点续传下载程序。qt4、qt5均可以编译通过,工程默认是qt5的工程。 (本人qt5.1.0 和 qt4.8.2 + vs2010下均测试过) 如果您想再qt4下编译,请: 1.修改工程工程的设置,设置好qt...

    JavaSE专题-多线程总结.doc

    多线程的常见问题总结分析 1、多线程技术介绍 2、主线程介绍 3、创建线程的方式 4、线程中的异常问题 5、线程运行状态 6、线程第二种创建方式 7、多线程练习 8、线程安全问题分析和...9、多线程细节 10、同步使用的锁

    C#多线程批量下载

    下载下来 直接运行就行,细节上有很多不足

    C#多线程编程实战_中文完整版

    《C#多线程编程实战》共分为11章,第1章介绍C#中基本的线程操作;第2章描述线程交互细节;第3章解释线程池概念;第4章深入讲解任务并行库框架;第5章深入解释C#5.0中的新功能——异步方法;第6章描述.NET框架中并行...

    多线程采集C#源代码

    多线程采集C#源代码 此程序采用vs2005开发,为windows窗体程序,已经具备多线程采集器所需的基本功能! 将源码发出来让那些正在学习.NET的朋友研究,还有很多细节地方让大家自己去完善和扩展。

    Win32多线程程序设计(清晰版)

    Win32多线程程序设计(完美版): ...学习Win32必不可少的一本书,通过本书您能够清晰的了解win32多线程的一些运行机制和细节。能够写出更好,更高效,更安全的win32多线程程序。本书由台湾知名技术作家侯捷著作。

    利用WinInet和多线程实现实时显示的下载进度条

    本例程用到4个WinInet接口函数,分别是InternetGetConnectdState、InternetOpen、InternetOpenUrl和HttpQueryInfo,分别用以获取当前网络连接信息、打开...在工程中,我们写一个函数InternetGetFile对下载细节进行封装

Global site tag (gtag.js) - Google Analytics