导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

关于MFC定时器与互斥的错误

逗比汪星人 2009-07-31 02:42:45
我现有进程AB,用互斥互相监视(如果其中一个不存在的话另一个也终止)

A:

1、OnInitDialog

// TODO: Add extra initialization here
HANDLE hMutex = CreateMutex(NULL, FALSE, "B1");
SetTimer(1,2000,NULL);

2、Ontimer()

if(nIDEvent ==1)
{
HANDLE m_hMutexB2 = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "B2");
if (m_hMutexB2 == NULL)
{
// 如果已有互斥量存在则释放句柄并复位互斥量
KillTimer(1);
EndDialog(IDOK);
return;
}
}

B:

1、OnInitDialog

HANDLE hMutex = CreateMutex(NULL, FALSE, "B2");
SetTimer(1,2000,NULL);

2、Ontimer()

if(nIDEvent ==1)
{
HANDLE m_hMutex = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "B1");
if (m_hMutex == NULL)
{
// 如果已有互斥量存在则释放句柄并复位互斥量
KillTimer(1);
EndDialog(IDOK);
return;
}
}

可AB任意一个退出另一个照样运行,我看了许久逻辑上应该没错误呀!
...全文
106 点赞 收藏 17
写回复
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
逗比汪星人 2009-08-01
谢谢各位老大!!

回复
Conry 2009-07-31
[Quote=引用 7 楼 bragi523 的回复:]
因为你退出的时候并没有释放Mutex啊
加上ReleaseMutex("B1");
保存句柄
CloseHandle(handle);


[/Quote]
up
注意资源的释放,你没有释放,当然open就不为空
回复
x22ray 2009-07-31
if (m_hMutexB2 == NULL)
{
// 如果已有互斥量存在则释放句柄并复位互斥量
KillTimer(1);
EndDialog(IDOK);
return;


若是m_mutexB2为null的话,互斥对像是不会存在的。。改为m_hmutexb2!=0
还有你没
回复
gg606 2009-07-31
OnTimer

if(1 == nIDEvent)
{
HANDLE hMutexB1 = OpenMutex(MUTEX_ALL_ACCESS, FALSE, "B1");
if (hMutexB1)
::CloseHandle(hMutexB1);
else
{
KillTimer(1);
EndDialog(IDOK);
}
}

回复
jyh_baoding 2009-07-31
可能OpenMutex调用失败
回复
yxq281426250 2009-07-31
学习~!~~!
回复
aa3000 2009-07-31
记得要 CloseHandle
回复
回帖才有可用分,和我一样,老是忘释放某个东西,出现奇怪的错误。
被前辈骂几次就记住了。
回复
zyq5945 2009-07-31
可以在Ontimer用CreateMutex创建如上,看该对象是否存在,存在的话进程就还在
逻辑是没错,估计是OpenMutex打开的时候互斥体内核对象引用计数+1了,你可以试试用CloseHanlde函数-1互斥体内核对象引用计数看看,内核对象的引用计数为0时该对象才销毁。
回复
zyq5945 2009-07-31
[Quote=引用 2 楼 zwicker 的回复:]
windows核心编程
C/C++ codeint WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE,
PSTR pszCmdLine,int nCmdShow)
{
HANDLE h= CreateMutex(NULL, FALSE,"{FA531CC1-0497-11d3-A180-00105A276C3E}");
lf (GetLastError()== ERROR_ALREADY_EXISTS)
{//There is already an instance//of the application runningreturn(0),
}//This is the first instance of this application running.//Before exiting ,close the object. CloseHandle(h),return(0);
}
[/Quote]
可以在Ontimer用CreateMutex创建如上,看该对象是否存在,存在的话进程就还在
逻辑是没错,估计是OpenMutex打开的时候互斥体内核对象应用计数+1了,你可以试试用CloseHanlde函数-1互斥体内核对象计数看看,内核对象的引用计数为零时该对象才销毁。
回复
bragi523 2009-07-31
因为你退出的时候并没有释放Mutex啊
加上ReleaseMutex("B1");
保存句柄
CloseHandle(handle);

回复
快乐鹦鹉 2009-07-31
可以跨进程。
建议自己调试一下。在其中一个进程的定时处理中增加断点。关闭另一个进程后,检查定时器的处理,比如EndDialog(IDOK);是否被执行到。然后再进一步判断原因。因为现在并不清楚你的进程是什么样的工程。该对话框退出就能退出进程了吗?
另外,你这么两个进程,是怎样启动的呢?两秒之内必须都运行起来吧。
回复
Tolirry 2009-07-31
OpenMutex能跨进程。
不过,搂主的思想正确,但是,OpenMutex后,必须CloseHandle,否则,还有句柄引用"B1"或者"B2",所以,以后的OpenMutex没有为NULL,所以就没有达到搂主期望的结果咯。
回复
雪影 2009-07-31
[Quote=引用 3 楼 windandsnow 的回复:]
OpenMutex()只是在同一个进程中不同线程中用吧,能跨进程吗?
[/Quote]
可以的

CreateMutex的第二个参数使用TRUE试一试;
CreateMutex (NULL, true, "B1") ;
回复
WindAndSnow 2009-07-31
OpenMutex()只是在同一个进程中不同线程中用吧,能跨进程吗?
回复
zwicker 2009-07-31
windows核心编程

int WINAPI WinMain(HINSTANCE hinstExe, HINSTANCE,
PSTR pszCmdLine, int nCmdShow)
{
HANDLE h = CreateMutex(NULL, FALSE,
"{FA531CC1-0497-11d3-A180-00105A276C3E}");
lf (GetLastError() == ERROR_ALREADY_EXISTS)
{
//There is already an instance
//of the application running
return(0),
}

//This is the first instance of this application running.
//Before exiting ,close the object.
CloseHandle(h),
return(0);
}
回复
雪影 2009-07-31
if (m_hMutex == NULL)中调用GetLastError
查看一下问什么没有打开m_hMutex
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……