• 多线程专题之线程参数


    多线程专题之线程参数 

    多线程应用 2010-11-28 22:12:45 阅读84 评论0    字号: 订阅

    .传递一般参数:

        线程函数:

    static DWORD ThreadProc(
         LPVOID lpParameter
         )
    {
     //USAGE ONE
     CString *strArg = (CString*)lpParameter;
     *strArg = "Hello World!";
     return 0;
    }

    线程的创建和参数的传递:

    void CMultiThreadDlg::OnBtnUsageOne()
    {
     // TODO: Add your control notification handler code here
     HANDLE hThread = NULL;
     CString strArg = _T("");
     
     hThread = ::CreateThread(
      NULL/*系统安全描述,NULL*/,
      0/*Windows系统一般线程栈大小为1 MB,创建线程的数目与物理内存和栈空间大小有关*/,
      (LPTHREAD_START_ROUTINE)ThreadProc/*线程启动函数*/,
      (LPVOID)&strArg/*线程启动函数接收的参数*/,
      0/*CREATE_SUSPENDED*/,
      NULL/*线程ID*/);
     /* 如果你用全局的参数的话,建议加上volatile 标志。
     volatile 是告诉编译器不要对该变量作任何优化的,
     即不把它放到寄存器中。多线程中,volatile 是很重要的修饰符*/
     
     if( hThread )
     {
      Sleep(100);        //睡眠一会,让新线程设置字符串
      AfxMessageBox(strArg);
      CloseHandle(hThread/*线程句柄*/);  //关闭线程句柄,减少内核对象的引用记数
     }
    }

    2.如何传递自定义参数.我们有没有注意到线程参数是个LPVOID类型的参数啊.这个就给了我们很大的传参数的自由度了啊.下面我们看看如何传啊

    首先是自定义参数的结构:

    typedef struct _ARG
    {
     HWND  hWnd;
     CString  strTitle;
     CString  strContext;
    }THREADARG,*PTHREADARG; //这是自己随便定义的

    然后是线程函数:

    static DWORD ThreadProc(
         LPVOID lpParameter
         )
    {
      //USAGE TWO
     PTHREADARG pArg = (PTHREADARG)lpParameter;
     MessageBox( pArg->hWnd, pArg->strContext, pArg->strTitle, MB_OK );
     return 0;
    }

    最后就是,创建线程了啊:

    void CMultiThreadDlg::OnBtnUsageTwo()
    {
     // TODO: Add your control notification handler code here
     HANDLE  hThread = NULL;
     THREADARG thread_arg;

     thread_arg.hWnd   = NULL;  //记住不能设置成m_hWnd,这样的话会出现死锁。不信,小样,你试试!
     thread_arg.strContext = _T("Hello World!");
     thread_arg.strTitle  = _T("Test Thread");
     
     hThread = ::CreateThread(
      NULL,        //系统安全描述,NULL
      0,         //Windows系统一般线程栈大小为1 MB,创建线程的数目与物理内存和栈空间大小有关
      (LPTHREAD_START_ROUTINE)ThreadProc, //线程启动函数
      (LPVOID)&thread_arg,    //线程启动函数接收的参数
      0,         //CREATE_SUSPENDED
      NULL);        //线程ID
     /* 如果你用全局的参数的话,建议加上volatile 标志。
     volatile 是告诉编译器不要对该变量作任何优化的,
     即不把它放到寄存器中。多线程中,volatile 是很重要的修饰符*/
     
     if( hThread )
     {
      WaitForSingleObject(hThread,INFINITE); //等待线程结束,否则的话你会得不到你想要的结果。(线程同步,以后讲了啊)
      CloseHandle(hThread);     //关闭线程句柄,减少内核对象的引用记数
     }
    }

  • 相关阅读:
    Android中的回调Callback
    vim编辑器配置及常用命令
    自定义View 和 ViewGroup
    BluetoothClass详解
    BluetoothServerSocket详解
    NSData转换成NSDictionary
    SDWebImage缓存图片的机制(转)
    非ARC和ARC下创建单利模式的宏定义,可以直接套用
    详细例子构建自定义cell
    使用FMDB框架来加载数据库
  • 原文地址:https://www.cnblogs.com/tianlangshu/p/1989556.html
Copyright © 2020-2023  润新知