大致代码如下:
HANDLE CImpIEFav::hMutex=NULL;
CImpIEFav::CImpIEFav(CWnd* pParent /*=NULL*/)
: CExDialog(CImpIEFav::IDD, pParent)
{
//{{AFX_DATA_INIT(CImpIEFav)
//}}AFX_DATA_INIT
hMutex = CreateMutex(NULL , false, _T("hmutex"));
}
线程函数:
UINT CImpIEFav::ThreadProc(LPVOID pParam)
{
CImpIEFav *dlg=(CImpIEFav*)pParam;
int i=0;
WaitForSingleObject(hMutex,INFINITE);
{
for (i=0;i<25;i++)
{
dlg->SetProgress(i);
Sleep(50);
}
dlg->ExportFavorite2();
for (i=26;i<50;i++)
{
dlg->SetProgress(i);
Sleep(50);
}
}
ReleaseMutex(hMutex);
// dlg->PostMessage(WM_PAINTMSG, 0, 0);
return 1;}
消息响应函数:
void CImpIEFav::OnButtonClose3()
{
// TODO: Add your control notification handler code here
WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号
//ReleaseMutex(hMutex);
CDialog::OnOK();
}可是我一响应OnButtonClose3() ,程序就卡住了,
HANDLE CImpIEFav::hMutex=NULL;
CImpIEFav::CImpIEFav(CWnd* pParent /*=NULL*/)
: CExDialog(CImpIEFav::IDD, pParent)
{
//{{AFX_DATA_INIT(CImpIEFav)
//}}AFX_DATA_INIT
hMutex = CreateMutex(NULL , false, _T("hmutex"));
}
线程函数:
UINT CImpIEFav::ThreadProc(LPVOID pParam)
{
CImpIEFav *dlg=(CImpIEFav*)pParam;
int i=0;
WaitForSingleObject(hMutex,INFINITE);
{
for (i=0;i<25;i++)
{
dlg->SetProgress(i);
Sleep(50);
}
dlg->ExportFavorite2();
for (i=26;i<50;i++)
{
dlg->SetProgress(i);
Sleep(50);
}
}
ReleaseMutex(hMutex);
// dlg->PostMessage(WM_PAINTMSG, 0, 0);
return 1;}
消息响应函数:
void CImpIEFav::OnButtonClose3()
{
// TODO: Add your control notification handler code here
WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号
//ReleaseMutex(hMutex);
CDialog::OnOK();
}可是我一响应OnButtonClose3() ,程序就卡住了,
解决方案 »
- 树目录和列表的问题
- 写XML文件问题_初次接触
- statusbar的问题
- 关于在水晶报表中插入我自己填入编辑框的数据,急!!!
- [请教] 在哪个编辑框中输入字按下回车就显示出哪个编辑框的字符.
- 向另外程序发送消息的问题!--》肯定有人会
- 用ADO连接ORACLE数据库的问题!!
- 这是一个PETZOLD的例程,程序用GetSystemMetrics ()来取得系统参数,可是,为什么最后几个参数在编译时会出错?PETZOLD的经典书再版这么
- panda_w这是怎么回事?关注一下嘛,我可是第一次Call你
- VC如何调用打包另一程序???
- 数组类编译错误
- C++ : 在文件内容中以正则表达式匹配一段字符出来:
while( 1 )
{
if( WAIT_TIMEOUT != WaitForSingleObject(hMutex,100) )
{
// break;
}
}
__________________________________________________________________为什么呢,它不是等待线程函数执行完毕后再执行的吗?为什么会卡住呢
CImpIEFav *dlg=(CImpIEFav*)pParam;
HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T("hmutex"));
...
我看很多的程序都是两组
WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号
ReleaseMutex(hMutex);
一起使用的啊。从而达到同步。
while( 1 )
{
if( WAIT_TIMEOUT != WaitForSingleObject(hMutex,100) )
{
break;
}
}一样卡住
ReleaseMutex(hMutex);
----------------------------------------------------
WaitForSingleObject(hMutex,INFINITE);//
不是等待hMutex有信号,并使得hMutex无信号吗?
ReleaseMutex(hMutex);使得hMutex有信号在消息函数里调用WaitForSingleObject(hMutex,INFINITE);//
不是应该等待线程函数里执行到ReleaseMutex(hMutex);使得hMutex有信号
后才执行下去吗
可是为什么会一直卡住呢?
我只要这个解释
--------------------------------------------------
你的代码不是很清楚啊,不要用到
WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号
ReleaseMutex(hMutex); 吗
还有那个句柄定义到函数里,外面怎么用,搞不懂还有既然我的理解没错,为什么我的代码会有问题,能给个解释吗
我看别人的程序都是这样用的
不是吧,就是删除一行,添加一行而已首先,HANDLE CImpIEFav::hMutex=NULL;这个赋值,你要搞清楚赋给谁了?这个和你运行时的对象的成员变量没有关系,画蛇添足了。
其次,主线程和子线程公用一个内核对象,你需要使用安全的方式,例如主线程CREATE,子线程按照名字OPEN。
-----------------------------------------
你的意思是把HANDLE CImpIEFav::hMutex=NULL; 去掉
然后在线程函数里添加
HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T("hmutex"));
如果这样的话,我执行下面的语句的hMutex从哪里来
WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号
ReleaseMutex(hMutex); 吗
,
也没几句代码你干脆给我个全的得了,越搞越乱
还有我的理解没错以及我看到的很多代码都这样处理同步的
为什么我的会有问题??