windowsapi函数:Windows API一日一练(43)WaitForSingleObject函数



  上面已经介绍如何样创建个简单线程在那里就需要使用WaitForSingleObject它是用来做什么呢?其实它是用来实现等待线程结束机理是这样通知Windows操作系统现在我进入睡眼状态当我关注对象条件是否满足如果满足了就吵醒我在那里关注对象是线程是否退出这是个条件测试如果不等待线程关闭就去删除线程资源就会出错使用前面线程是简单但它不合适复用现在就使用C++类来封装个比较好用这样就可以很方便地创建很多线程来使用当然还可以继承它实现更复杂功能下面就来学习这个例子

  WaitForSingleObject声明如下:

WINBASEAPI
DWORD
WINAPI
WaitForSingleObject(
    __in HANDLE hHandle,
    __in DWORD dwMilliseconds
    );


  hHandle是等待对象句柄

  dwMilliseconds是等待时间条件可以永远等待下去

  这个例子如下:

#001 #pragma once
#002 
#003 //线程类
#004 //蔡军生 2007/09/23
#005  CThread
#006 {
#007 public:
#008 
#009  CThread(void)
#010  {
#011          m_hThread = NULL;
#012  }
#013 
#014  virtual ~CThread(void)
#015  {
#016          (m_hThread)
#017         {
#018               //删除线程资源
#019               ::CloseHandle(m_hThread);
#020         }
#021         
#022  }
#023 
#024  //创建线程
#025  HANDLE CreateThread(void)
#026  {
#027         //创建线程
#028          m_hThread = ::CreateThread( 
#029               NULL,                    //安全属性使用缺省
#030               0,                         //线程堆栈大小
#031               ThreadProc,                 //线程运行地址
#032               this,                      //传给线程参数
#033               0,                         //创建标志
#034               &m_dwThreadID);        //成功创建后线程标识码
#035 
#036          m_hThread;
#037  }
#038 
#039  //等待线程结束
#040  void WaitFor(DWORD dwMilliseconds = INFINITE)
#041  {
#042         //等待线程结束
#043        ::WaitForSingleObject(m_hThread,dwMilliseconds);
#044  }
#045 
#046 protected:
#047  //
#048  //线程运行
#049  //蔡军生 2007/09/21
#050  //
#051   DWORD WINAPI ThreadProc(LPVOID lpParameter)
#052  {
#053         //输出到调试窗口
#054         ::OutputDebugString(_T("ThreadProc线程运行\r\n"));
#055 
#056         //线程返回码
#057          0;
#058  }
#059 
#060 protected:
#061  HANDLE m_hThread;         //线程句柄
#062  DWORD m_dwThreadID;          //线程ID
#063 
#064 };
#065 


  使用这个线程:

#001 //
#002 // 响应命令.
#003 // 蔡军生 2007/09/21 QQ:9073204
#004 //
#005 LRESULT CCaiWinMsg::OnCommand( nID, nEvent)
#006 { 
#007  // 菜单选项命令响应:
#008  switch (nID)
#009  {
#010   IDC_CREATEBTN:
#011         //显示个按钮
#012          (!m_hBtn)
#013         {
#014                m_hBtn = CreateWindow(_T("BUTTON"),_T("按钮"),
#015                    WS_VISIBLE|WS_CHILD|BS_PUSHBUTTON,
#016                    50,50,100,32,
#017                     m_hWnd,(HMENU)IDC_BTN,m_hInstance,NULL);
#018         }                                           
#019         ;
#020   IDC_BTN: 
#021         {
#022              CThread threadDemo;
#023              threadDemo.CreateThread;
#024              threadDemo.WaitFor;
#025 
#026               //
#027               OutputDebugString(_T("按钮按下\r\n"));                                 
#028         }         
#029         ;
#030  default:
#031          CCaiWin::OnCommand(nID,nEvent);
#032  }
#033 
#034   1;
#035 }


Tags:  api函数大全 api函数 windowsapi函数库 windowsapi函数

延伸阅读

最新评论

发表评论