友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第32章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






    数。为了保证多线程情况下的安全,C runtime  函数库必须为每一个执行线程做一些簿记工 



    作。没有这些工作,C runtime  函数库就不知道要为每一个执行线程配置一块新的内存, 



    做为执行线程的区域变量用。因此,CreateThread 有一个名为_beginthreadex  的外包函数, 



    负责额外的簿记工作。 



    请注意函数名称的底线符号。它必须存在,因为这不是个标准的ANSI C runtime  函数。 



    _beginthreadex  的参数和CreateThread  的参数其实完全相同,不过其型别已经被「净化」 



    了,不再有Win32 型别包装。这原本是为了要让这个函数能够移植到其它操作系统,因 



    为微软希望_beginthreadex 能够被实作于其它平台,不需要和Windows 有关、不需要 



    包含windows。h 。但实际情况是,你还是得调用CloseHandle  以关闭执行线程, 而 

                                                                    



    CloseHandle 却是个Win32 API ,所以你还是需要包含windows。h 、还是和Windows 脱 



    离不了关系。微软空有一个好主意,却没能落实它。 



    把_beginthreadex 视为CreateThread  的一个看起来比较有趣的版本,就对了: 



        unsigned long _beginthreadex ( 



                         void *security; 



                         unsigned stack_size; 



                         unsigned  (__stdcall *start_address)(void *); 



                         void *arglist; 



                         unsigned initflag; 



                         unsigned* thrdaddr 



                          ); 



    _beginthreadex 所传回的unsigned long 事实上就是一个Win32 HANDLE ,指向新执行 



    线程。换句话说传回值和CreateThread 相同,但_beginthreadex 另外还设立了errno 和 



    doserrno 。 



    下面是一个最简单的使用范例: 



     #0001 #include  



     #0002  #include  



                                                                                46 


…………………………………………………………Page 109……………………………………………………………

#0003  unsigned __stdcall myfunc(void* p); 

#0004 

#0005  void main() 

#0006  { 

#0007      unsigned long thd; 

#0008      unsigned tid; 

#0009 

#0010      thd = _beginthreadex(NULL; 

#0011                           0; 

#0012                           myfunc; 

#0013                           0; 

#0014                           0; 

#0015                           &tid ); 

#0016      if (thd != NULL) 

#0017      { 

#0018          CloseHandle(thd); 

#0019      } 

#0020  } 

#0021 

#0022  unsigned __stdcall myfunc (void* p) 

#0023  { 

#0024      // do your job。。。 

#0025  } 



针对Win32 API ExitThread ,也有一个对应的C runtime  函数:_endthreadex 。它只需要 



一个参数,就是由_beginthreadex 第6个参数传回来的ID 值。 



关于_beginthreadex 和_endthreadex ,以及执行线程的其它各种理论基础、程序技术、使 



用技巧,可参考由Jim Beveridge & Robert Wiener 合着,Addison Wesley  出版的 



Multithreading Applications in  Win32     Win32                 /         /  

                                    一书(          多线程程序设计 侯俊杰译 峰出 



版)。 



                                                                                               47 


…………………………………………………………Page 110……………………………………………………………

执行线程优先权 (                   y) 

                      Priorit 



  优先权是排程的重要依据。优先权高的执行线程,永远先获得CPU  的青睐。当然啦,操作 



  系统会视情况调整各个执行线程的优先权。例如前景执行线程的优先权应该调高一些,背 



  景执行线程的优先权应该调低一些。 



                       0         31 

  执行线程的优先权范围从            (最低)到  (最高)。当你产生执行线程,并不是直接以数值 



  指定其优先权,而是采用两个步骤。第一个步骤是指定「优先权等级(Priority Class )」 



  给进程,第二步骤是指定「相对优先权」给该进程所拥有的执行线程。图1…7 是优先权等 



  级的描述,其中的代码在CreateProcess  的dwCreationFlags 参数中指定。如果你不指 



                    NORMAL  PRIORIT Y  CLASS … 

                           _        _ 

  定, 系统预设给的是                                 除非父进程是 



  IDLE  PRIORIT Y  CLASS              IDLE  PRIORIT Y  CLASS 

      _        _                          _        _ 

                      (那么子进程也会是                          )。 



      等级         代码                            优先权值      



     idle       IDLE_PRIORITY_CLASS            4 



                                               9           7 

     normal     NORMAL_PRIORITY_CLASS            (前景)或 (背景) 



     high       HIGH_PRIORITY_CLASS            13 



     realtime   REALTIME_PRIORITY_CLASS        24 



                图 1…7    Win32 执 行 线 程 的优先权等级划分 



  ■ 〃idle〃         CPU  

        等级只有在          时间将被浪费掉时(也就是前一节所说的空闲时间) 



     才执行。此等级最适合于系统监视软件,或屏幕保护软件。 



  ■ 〃normal〃                                         〃normal〃  

            是预设等级。系统可以动态改变优先权,但只限于                          等级。 



                                      9                            7 

     当进程变成前景,执行线程优先权提升为 ,当进程变成背景,优先权降低为 。 



  ■ 〃high〃                                     Ctrl+Esc  

          等级是为了立即反应的需要,例如使用者按下                        时立刻把工作管 



     理器(task manager )带出场。 



  ■ 〃realtime〃  

             等级几乎不会被一般应用程序使用。就连系统中控制鼠标、键盘、 



                                                                               48 


…………………………………………………………Page 111……………………………………………………………

 磁盘状态重新扫描、Ctrl+Alt+Del 等的执行线程都比〃realtime〃 优先权还低。这 



 种等级使用在「如果不在某个时间范围内被执行的话,资料就要遗失」的情况。 



 这个等级一定得在正确评估之下使用之,如果你把这样的等级指定给一般的 



  (并不会常常被阻塞的)执行线程,多任务环境恐怕会瘫痪,因为这个执行线程有如 



 此高的优先权,其它执行线程再没有机会被执行。 



                                             IDLE      NORMAL 

 上述四种等级,每一个等级�
返回目录 上一页 下一页 回到顶部 赞(1) 踩(1)
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!