C++编程:如何安全终止线程(3)

http://www.itjxue.com  2015-07-17 00:54  来源:未知  点击次数: 

  (6)在CDemoDlg类的OnInitDialog函数中添加如下代码:

  // DemoDlg.cpp

  BOOL CDemoDlg::OnInitDialog()

  {

  CDialog::OnInitDialog();

  // …

  SetDlgItemInt(IDC_DATA, m_nData);

  return TRUE;

  }

  (7)在文件中定义线程消息,代码如下:

  // DemoDlg.h

  #define WM_THREADMSG WM_USER+1

  (8)在文件中定义线程函数,代码如下:

  // DemoDlg.h

  UINT ThreadProc(LPVOID pParam);

  // DemoDlg.cpp

  UINT ThreadProc(LPVOID pParam)

  {

  //线程参数

  THREAD_PARAM* pThreadParam = (THREAD_PARAM*)pParam;

  while (!pThreadParam->bExit)

  {

  Sleep(100);

  pThreadParam->nData++;

  //向主线程窗口发送消息

  ::PostMessage(pThreadParam->hWnd, WM_THREADMSG, 0, 0);

  }

  return 0;

  }

  (9)在CDemoDlg类中分别为Button控件添加BN_CLICKED添加消息处理函数,代码如下:

  // DemoDlg.cpp

  void CDemoDlg::OnBeginThread()

  {

  if (m_pThread != NULL)

  {

  AfxMessageBox(_T("线程已经启动。"));

  return;

  }

  m_ThreadParam.hWnd = m_hWnd;

  m_ThreadParam.bExit = FALSE;

  //启动线程,初始为挂起状态

  m_pThread = AfxBeginThread(ThreadProc, &m_ThreadParam,

  THREAD_PRIORITY_ABOVE_NORMAL, 0, CREATE_SUSPENDED);

  //线程结束时不自动删除

  m_pThread->m_bAutoDelete = FALSE;

  //恢复线程运行

  m_pThread->ResumeThread();

  }

  void CDemoDlg::OnEndThread()

  {

  if (m_pThread == NULL)

  {

  AfxMessageBox(_T("线程已经终止。"));

  return;

  }

  m_ThreadParam.bExit = TRUE;

  //等待线程结束

  ::WaitForSingleObject(m_pThread->m_hThread, INFINITE);

  delete m_pThread;

  m_pThread = NULL;

  }

  (10)在CDemoDlg类中添加自定义消息处理函数,代码如下:

  // DemoDlg.h

  afx_msg LRESULT OnMsgFunc();

  // DemoDlg.cpp

  BEGIN_MESSAGE_MAP(CDemoDlg, CDialog)

  ON_MESSAGE(WM_THREADMSG, OnMsgFunc)

  END_MESSAGE_MAP()

  LRESULT CDemoDlg::OnMsgFunc()

  {

  SetDlgItemInt(IDC_DATA, m_ThreadParam.nData);

  return 1;

  }

(责任编辑:IT教学网)

更多

推荐计算机等级考试文章