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;
    }
    


  • 相关阅读:
    【UWP】使用Action代替Command
    【UWP】在不同类库使用ResourceDictionaries
    【UWP】不通过异常判断文件是否存在
    【UWP】批量修改图标尺寸
    【UWP】FlipView绑定ItemsSource,Selectedindex的问题
    【UWP】UI适配整理
    【iOS】Object-C注释
    【iOS】desctiption和debugDescription
    【iOS】关联属性存取数据
    【iOS】配置和使用静态库
  • 原文地址:https://www.cnblogs.com/riskyer/p/3313231.html
Copyright © 2011-2022 走看看