欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > DOC文档下载  

    曹文轩对中国成长小说探索及其意义.doc

    • 资源ID:11185172       资源大小:31KB        全文页数:12页
    • 资源格式: DOC        下载积分:4
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要4
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    曹文轩对中国成长小说探索及其意义.doc

    基于的多线程通信程序设计>介绍了Windows多线程技术、多线程间通信、以及多线程通信程序设计的主要函数,然后在前面关键技术的基础上,采用VC+ 6.0 为开发平台, 实现了一个基于VC+的多线程局域网聊天程序。在多任务Windows编程中,为了提高代码的时、空效率,广泛采取后台程序和前台程序,而前台任务及后台任务是通过多线程技术来实现,从而线程间的通信就变得极为重要。Visual C+对Windwos线程和消息的多任务机制提供了强有力的支持,并封装了大量的通信函数,给多线程通信程序编程带来了很大的便利。1 多线程技术概述多线程在Windows编程中是一个比较重要的概念。所谓多线程,即在同一个程序中可以同时执行多个任务。这意味着,编程者可以将整个任务分成几个线程,然后让操作系统同时执行,从而提高程序的执行效率。一般线程被分为两种:用户界面线程和工作线程(又称为后台线程)。1.1 创建线程与终止线程创建线程的过程可以分成两大步骤,首先编写线程函数,然后创建线程,并将其参数线程函数地址指向刚刚编写的线程函数。线程函数的退出,除了使用退出函数处理外,大都是随着程序的结束而退出。1.2 线程同步多线程提高了程序执行的效率,提高了编程的灵活性,但同时也引入了新的问题。线程之间经常要同时访问一些资源,因此对共享资源进行访问引起冲突是不可避免的。另外,在Windwos的消息驱动方式下,必须某个事件的发生了,才可以执行某个线程,为了解决上述问题,必须引入线程同步的概念。Win32 API提供了多种同步控制对象,包括临界区、互斥对象、信号量和事件。2 多线程间通信一般而言,应用程序中的一个次要线程总是为主线程执行特定的任务,这样,主线程和次要线程间必定有一个信息传递的渠道,也就是主线程和次要线程间要进行通信。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的。多线程间通信可以采用全局变量、自定义消息、事件对象通信。1) 使用全局变量进行通信由于属于同一个进程的各个线程共享操作系统分配该进程的资源,故解决线程间通信最简单的一种方法是使用全局变量。对于标准类型的全局变量,可以使用volatile修饰符,它告诉编译器无需对该变量作任何的优化,即无需将它放到一个寄存器中,并且该值可被外部改变。如果线程间所需传递的信息较复杂,可以定义一个结构,通过传递指向该结构的指针进行传递信息。2) 使用自定义消息进行通信可以在一个线程的执行函数中向另一个线程发送自定义的消息来达到通信的目的。一个线程向另外一个线程发送消息是通过操作系统实现的。利用Windows操作系统的消息驱动机制,当一个线程发出一条消息时,操作系统首先接收到该消息,然后把该消息转发给目标线程,接收消息的线程必须已经建立了消息循环。3) 使用事件对象进行通信在线程之间传送信号的一种比较复杂的方法是使用享件对象,在MFC中有一个事件类CEvent。一个事件对象可以处于两种状态的一种:信号态和非信号态。线程能够监视处于信号态的事件,以便在适当的时间执行对事件的操作。3 多线程通信程序设计3.1 重要函数1) Win32 API对多线程编程的支持Win32提供了一系列的API函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行说明。HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,如果创建成功则返回线程的句柄,否则返回NULL。DWORD SuspendThread(HANDLE hThread);该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。DWORD ResumeThread(HANDLE hThread);该函数用于结束线程的挂起状态,执行线程。VOID ExitThread(DWORD dwExitCode);该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwExitCode用来设置线程的退出码。BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode);一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用TerminateThread强行终止某一线程的执行。使用TerminateThread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。BOOL PostThreadMessage(DWORD idThread,UINT Msg,WPARAM wParam,LPARAM lParam);该函数将一条消息放入到指定线程的消息队列中,并且不等到消息被该线程处理时便返回。调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。2) MFC对多线程编程的支持MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。工作者线程没有消息机制,通常用来执行后台计算和维护任务,如冗长的计算过程,打印机的后台打印等。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。但对于Win32的API编程而言,这两种线程是没有区别的,它们都只需线程的启动地址即可启动线程来执行任务。在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程。两种重载函数原型和参数分别说明如下:CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,LPVOID pParam,nPriority=THREAD_PRIORITY_NORMAL, UINT nStackSize=0,DWORD dwCreateFlags=0,LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass,int nPriority=THREAD_PRIORITY_NORMAL,UINT nStackSize=0,DWORD dwCreateFlags=0, LPSECURITY_ATTRIBUTES lpSecurityAttrs=NULL);一般情况下,调用AfxBeginThread()来一次性地创建并启动一个线程,但是也可以通过两步法来创建线程:首先创建CWinThread类的一个对象,然后调用该对象的成员函数CreateThread()来启动该线程。virtual BOOL CWinThread:InitInstance();重载该函数以控制用户界面线程实例的初始化。初始化成功则返回非0值,否则返回0。用户界面线程经常重载该函数,工作者线程一般不使用InitInstance()。virtual int CWinThread:ExitInstance();在线程终结前重载该函数进行一些必要的清理工作。该函数返回线程的退出码,0表示执行成功,非0值用来标识各种错误。同InitInstance()成员函数一样,该函数也只适用于用户界面线程。3.2 VC+下多线程局域网聊天程序聊天程序是现代生活中不可缺少的通信工具,为了在局域网中实现点对点的实时通信,在VC+的编程环境中,利用套接字库技术和多线程编程技术实现聊天程序。1) 界面设计。界面设计如图1所示。2) 函数void CMyQQDlg: SendMsg() /发送消息void CMyQQDlg: SendFile() /发送文件void CMyQQDlg: Caputer() /抓取屏幕void CMyQQDlg:AddMsgList(CString IP,CString str) /添加信息于LISTBOX 控件中CString CMyQQDlg:GetError(DWORD error) /返回错误信息int CMyQQDlg:GetLocalHostName(CString & sHostName) /获得本地计算机名称int CMyQQDlg:GetIpAddress(const CString & sHostName, CString & sIpAddress)/获得本地IPint CMyQQDlg:GetNamebyAddress(const CString & IpAddress,CString & sYouName)/获得对方计算机名称3) 线程启动pThreadLisen=:AfxBeginThread(_ListenTcpThread,this); /开始TCP线程pThreadLisen=:AfxBeginThread(_UDPThread,this); /开始UDP线程4) 服务器线程UINT _ListenTcpThread(LPVOID lparam) /TCP监听线程UINT _UDPThread(LPVOID lparam) /UDP接受信息线程开始5) 客户端线程UINT _SendFileThread(LPVOID lparam) /发送文件线程UINT _SendMsgThread(LPVOID lparam) /TCP发送信息线程UINT _SendMsgUdpThread(LPVOID lparam) /UDP发送信息UINT _ThreadCapture(LPVOID lparam) /抓取对方屏幕线程以上程序在Windows XP, Microsoft Visual C+6.0中编译执行通过。4 结束语要设计出性能较好的多线程通信程序,不仅需要对操作系统的处理过程很清楚,还需要对VC+的线程处理函数十分了解,并对具体应用中各线程的关系非常清楚,以利于在应用程序中控制同步事件的发生,避免出现死锁或不能同步处理的现象。作者:杨红军王金英 来源:电脑知识与技术学术交流 2008年29期

    注意事项

    本文(曹文轩对中国成长小说探索及其意义.doc)为本站会员(scccc)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开