Windows95下多线程编程技术及其实现.docx

  1. 1、本文档共5页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows95下多线程编程技术及其实现 笔者最近在开发基于Internet网上的可视电话过程中碰到了这样一个问题, 即在基于In ternet网上的可视电话系统中,同时要进行语音采集、语音编 译码、图像采集、图像编译码、语音和图像码流的传输,所有这些工作,都 要并行处理。特别是语音信号,如果进行图像编解码时间过长,语音信号得 不到服务,通话就有间断;如果图像或语音处理时间过长,而不能及时传输 码流数据,通信同样也会中断。这样就要求我们实现一种并行编程,在只有 一个CPU的机器上,也就是要将该CPU时间按时一定的优先准则分配给各个事 件,定期处理各事件,而不会对某一事件处理过长。在32位Windows95或Windows NT 下,我们可以用多线程的处理技术来实现这种并行处理。实际上,这种并行编 程在很多场合下都是必须的。例如,在File Manager拷贝文件时,它显示一个 对话框中包含了一个Cancel按钮。如果在文件拷贝过程中,点中Cance l按钮, 就会终止拷贝。在16位Winows中,实现这类功能需要在File Copy循环内部周 期性地调用PeekMessage函数。如果正在读一个很大的动作;如果从软盘读文 件,则要花费好几秒的时间。由于机器反应太迟钝,用户会频繁地点中这个按钮, 以为系统不知道想终止这个操作。如果把File Copy指令放入另外一个线程, 就不需要在代码中放一大堆PeekMessage函数,处理用户界面的线程将与它分 开操作,点中Cancel按钮后会立即得到响应。同样的道理,在应用程序中创建 一个单独线程来处理所有打印任务也是很有用的,用户可以在打印处理时继续 使用应用程序。 线程的概念 为了了解线程的概念 ,我们必须先讨论一下进程的概念。一个进程通常定义 为程序的一个实例。在32位Windows中,进程占据4GB的虚拟地址空间。与它们 在MS-DOS和16位Windows操作系统中不同,32位Windows进程是没有活力的。这 就是说,一个32位Windows进程并不执行什么指令,它只是占据着4GB的地址空间, 此空间中有应用程序EXE文件的代码和数据。 EXE需要的DLL也将它们的代码的数据装入到进程的地址空间。除了地址空间, 进程还占有某些资源,比如文件、动态内存分配和线程。当进程终止时,在它 生命期中创建的各种资源将被清除。 如上所述,进程是没有活力的,它只是一个静态的概念。为了让进程完成一些工 作,进程必须至少占有一线程,所以线程是描述进程内的执行,正是线程负责执行 包含在进程的地址空间中的代码。实际上,单个进程可能包含几个线程,它们可 以同时执行进程的地址空间中的代码。为了做到这一点,每个线程有自己的一组 CPU寄存器和椎。每个进程至少有一个线址程在执行其地址空间中的代码,如果没 有线程执行进程地空间中的代码,如果没有线程执行进程地址空间中的代码,进程 也就没有继续存在的理由,系统将自动清除进程及其地址空间。为了运行所有这些 线程,操作系统为每个独立线程安排一些CPU时间,操作系统以轮转方式向线程提供 时间片,这就给人一种假象,好象这些线程都在同时运行。创建一个32位Windows进 程时,它的第一个线程称为主线程,由系统自动生成,然后可由这个主线程生成额外 的线程,这些线程又可生成更多的线程。 线程的编程技术 1.编写线程函数 所有线程必须从一个指定的函数开始执行,该函数称为线程函数,它必须具有下列原 型: DWORD WINAPI YourThreadFunc(LPVOID lpvT.hreadParm); 该函数输入一个LPVOID型的参数,可以是一个DWORD型的整数,也可以是一个指向一个 缓冲区的指针,返回一个DWORD型的值。像WinMain函数一样,这个函数并不由操作系 统调用,操作系统调用包含在KERNEL32.DLL中的非C运行时的一个内部函数,如 StartOfThread,然后由S tartOfThread函数建立起一个异常处理框架后,调用我们的函数。 2.创建一个线程 一个进程的主线程是由操作系统自动生成,如果要让一个主线程创建额外的线程,可 以调用CreateThread来完成。格式如下: HANDLE CreateThread(LPSECURITY_ATTRIBUTES jpsa.DWORD cbstack,LPTHREAD_START _ROUTINE lpStartAddr.LPVOID lpvThreadParm,DWORD fdwCreate,LPDWORD lpIDThread); 其中参数意义如下: lpsa:是一个指向SECURITY_ATTRIBUTES结构的指针。如果想让对象为缺省安 全属性的话

文档评论(0)

asd522513656 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档