大致代码如下:
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() ,程序就卡住了,

解决方案 »

  1.   

    WaitForSingleObject(hMutex,INFINITE); //这句一但执行,程序自然卡住弄一个较省事的吧
    while( 1 )
    {
        if( WAIT_TIMEOUT != WaitForSingleObject(hMutex,100) )
        {
              // break;
        }
    }
      

  2.   

    WaitForSingleObject(hMutex,INFINITE); //这句一但执行,程序自然卡住
    __________________________________________________________________为什么呢,它不是等待线程函数执行完毕后再执行的吗?为什么会卡住呢
      

  3.   

    去掉HANDLE CImpIEFav::hMutex=NULL;线程中改为:...
    CImpIEFav *dlg=(CImpIEFav*)pParam;
    HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T("hmutex"));
    ...
      

  4.   

    另外,你的WaitForSingleObject还是最好有个判断返回值的流程。
      

  5.   

    我想知道为什么,
    我看很多的程序都是两组
    WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号 
    ReleaseMutex(hMutex); 
    一起使用的啊。从而达到同步。
      

  6.   

    还有我在消息函数里用 了
    while( 1 )
    {
        if( WAIT_TIMEOUT != WaitForSingleObject(hMutex,100) )
        {
              break;
        }
    }一样卡住
      

  7.   

    WaitForSingleObject阻塞住了,并不是立刻返回啊
      

  8.   

    if( WAIT_TIMEOUT != WaitForSingleObject(hMutex,100)使用这个当然会卡啊,你还有WHILE(1)呢
      

  9.   

    WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号 
    ReleaseMutex(hMutex); 
    ----------------------------------------------------
    WaitForSingleObject(hMutex,INFINITE);//
    不是等待hMutex有信号,并使得hMutex无信号吗?
    ReleaseMutex(hMutex);使得hMutex有信号在消息函数里调用WaitForSingleObject(hMutex,INFINITE);//
    不是应该等待线程函数里执行到ReleaseMutex(hMutex);使得hMutex有信号
    后才执行下去吗
    可是为什么会一直卡住呢?
    我只要这个解释
      

  10.   

    你的理解没有问题,你的代码有问题,按照我3楼写的改了吗?
    --------------------------------------------------
    你的代码不是很清楚啊,不要用到
    WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号 
    ReleaseMutex(hMutex); 吗
    还有那个句柄定义到函数里,外面怎么用,搞不懂还有既然我的理解没错,为什么我的代码会有问题,能给个解释吗
    我看别人的程序都是这样用的
      

  11.   


    不是吧,就是删除一行,添加一行而已首先,HANDLE CImpIEFav::hMutex=NULL;这个赋值,你要搞清楚赋给谁了?这个和你运行时的对象的成员变量没有关系,画蛇添足了。
    其次,主线程和子线程公用一个内核对象,你需要使用安全的方式,例如主线程CREATE,子线程按照名字OPEN。
      

  12.   

    你的hMutex有信号吗?你的Create的时候指定的是无信号的
      

  13.   

    额,不好意思,看错了,你线程没有运行完 ,主界面肯定会卡在哪里等待的,还有MFC非线程安全,不要传对话框类的指针吧,改成窗口句柄吧,如GetSafeHwnd(),或者m_hWnd都可以的
      

  14.   

    不是吧,就是删除一行,添加一行而已 
    -----------------------------------------
    你的意思是把HANDLE CImpIEFav::hMutex=NULL; 去掉
    然后在线程函数里添加
    HANDLE hMutex = ::OpenMutex(MUTEX_ALL_ACCESS, FALSE, _T("hmutex"));
     
    如果这样的话,我执行下面的语句的hMutex从哪里来
    WaitForSingleObject(hMutex,INFINITE);//等待互斥对象有信号 
    ReleaseMutex(hMutex); 吗 

    也没几句代码你干脆给我个全的得了,越搞越乱
    还有我的理解没错以及我看到的很多代码都这样处理同步的
    为什么我的会有问题??