在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,我要如何使用互斥量才能点击一次释放,后台进程就运行一次呢?
首先是创建一个互斥量
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,我要如何使用互斥量才能点击一次释放,后台进程就运行一次呢?
解决方案 »
- CDockablePane的选项卡显示不正确的问题
- 用com的符合文件操作,出现故障了
- WSAAsyncSelect(m_Sock, m_hWnd, WM_SOCK_MSG, FD_READ | FD_CLOSE);只有FD_READ能触发事件,怎解?
- 两个类之间的数据通信
- 进程外服务器是怎样启动的?
- WaitForSingleObject函数疑问
- 关于CPropertySheet动态显示的问题,大小调节问题!
- AVI播放问题
- 这两个文件是做什么的,desktop.ini,folder.htt,哪位老兄能回答这个问题? 高分!
- 那有installshield的中文帮助文件可以下载,一般操作讲解的也可以。
- MFC OnDraw 函数
- windows中有几个消息队列?
---------------------------------------------------------
首先是创建一个互斥量
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;