zoukankan      html  css  js  c++  java
  • win32多线程程序设计笔记(第二章)

    第二章线程的第一次接触,主要讲了如何创建线程以及需要注意的几点。


    一、创建线程                   


    与调用函数的过程类似;线程只不过用CreateThread的API将函数封装起来,并产生一个与主程序同时执行的程序来调用被封装的函数。

    HANDLE hThread = CreateThread (
                 LPSECURITY_ATTRIBUTES lpThreadAtt,
                 DWORD dwStackSize
                 LPTHREAD_START_ROUTINE lpFun,
                 LPVOID lpParameter,
                 DWORD dwCreationFlags,
                 LPDWORD lpThreadID)
        LpFun:就是指向被封装的函数的地址。
        LpParameter: 就是指向被封装的函数的参数(没有参数填入null)


    下图为简单的函数调用和调用线程的过程:



    注意当用CreateThread之后,产生的新的线程不会立即启动,执行的时间也是无法预期的


    二、核心对象                      


               当调用CreateThread()后,会产生线程核心对象(如果已经产生了线程核心对象,那么就只将此核心对象的引用计数加1;另外,win32系统中有若干种核心对象),并以句柄handle指向它。那么,显然,在线程使用完毕后就应该用CloseHandle()函数关闭。

    三、线程结束                      

              既然线程是独立的运行的程序,那么主程序如何知道线程执行完毕呢?
             答案是通过GetExitCodeThread(HANDLE hThread,LPDWORD lpExitCode)函数。如果线程已结束,那么线程结束的代码被放在lpExitCode参数中带回来,如果线程尚未结束,lpExitCode带回来的值是STILL_ACTIVE。

    例:
    DWORD WINAPI ThreadFun(LPVOID n) //线程函数:
    {
        return 10;
    }
    
    int main()
    {
        hThrd = CreateThread(null,0,ThreadFun, …);
        DWORD  exitCode=0;
        for(  ;  ; ) {
            GetExitCodeThread(hThrd,&exitCode);
            if ( exitCode == STILL_ACTIVE){
                       //线程仍然在运行
            }
            else{
                       break;
            }
        }
        //exitCode保存了函数的返回值
        printf( “线程函数的返回值 : %d /n”, exitCode);
        CloseHandle(hThrd);
        return 0;
    }
    


  • 相关阅读:
    1024 Calendar Game
    外存管理与文件系统(1)
    1008 Gnome Tetravex
    写给想用技术改变世界的年轻人by 沃兹
    为什么VS2008里没有Silverlight呢?
    QQ消息群发器实现原理及核心代码
    JavaScript检测多组Radio是否选择
    C#操作Excel(导入导出)
    String.Split 方法有6个重载函数:
    【原】Ext2.2学习系列:ExtJS与.NET结合开发实例全部Ext2.2示例索引贴 (共收录56篇文章)
  • 原文地址:https://www.cnblogs.com/riskyer/p/3313231.html
Copyright © 2011-2022 走看看