在vc开发中使用互斥量的时候发现一个问题。我想先创建一个后台线程,程序启动时后台线程就运行,然后用按键发送一个互斥量触发线程的运行。代码如下:
首先是创建一个互斥量
g_hMutex = CreateMutex(NULL,FALSE,NULL);
然后在按钮程序代码如下:
void CzxDlg::OnBnClickedButtonTx()
{
  // TODO: Add your control notification handler code here
   ReleaseMutex(g_hMutex);
}
最后后台线程等待互斥量
UINT zx_runner(LPVOID pParams)
{
   CListBox *m_lplistout=NULL;
   int listboxIndex=0;
   CString s1;
    while(1)
   {
        WaitForSingleObject(g_hMutex,INFINITE);
m_lplistout = (CListBox *)pMainDlg->GetDlgItem(IDC_LIST_OUTPUT);
s1.Format("kk!");
listboxIndex = m_lplistout->AddString(s1);
m_lplistout->SetCaretIndex(listboxIndex,0);
   }
return 0;
}
结果我一点击按键后,输出结果不断的输出kk,我要如何使用互斥量才能点击一次释放,后台进程就运行一次呢?

解决方案 »

  1.   

    1  
    ---------------------------------------------------------
    首先是创建一个互斥量
    g_hMutex = CreateMutex(NULL,FALSE,NULL);
    然后在按钮程序代码如下:
    void CzxDlg::OnBnClickedButtonTx()
    {
      // TODO: Add your control notification handler code here
      ReleaseMutex(g_hMutex);
    }
    ---------------------------------------------------------
    互斥对象应该是谁拥有,谁释放的吧。CreateMutex创建的时候,第二个参数
    是FALSE,这样创建该互斥对象的线程就没有其所有权,那么它能通过ReleaseMutex
    来释放互斥对象的所有权吗?
    2  
    ---------------------------------------------------------
    结果我一点击按键后,输出结果不断的输出kk,我要如何使用互斥量才能点击一次释放
    ,后台进程就运行一次呢?
    ---------------------------------------------------------
    while(1)
    {
      WaitForSingleObject(g_hMutex,INFINITE);
      ... ...
    }
    一旦这个线程获得了互斥对象的所有权,并且一直没有ReleaseMutex释放。那么这个
    while循环里面的内容肯定是重复执行的,也就是不断输出kk。这个可以用一个全局
    或者类的成员变量来控制一下吧。比如:
    if(bFlag){
      bFlag = FALSE;
      m_lplistout = (CListBox *)pMainDlg->GetDlgItem(IDC_LIST_OUTPUT);
      s1.Format("kk!");
      listboxIndex = m_lplistout->AddString(s1);
      m_lplistout->SetCaretIndex(listboxIndex,0);
    }
    然后点击按钮的时候:
    bFlag = TRUE;