原因
这个得先说原因,我在使用c++执行cmd命令时,界面卡住,很明显的死锁状态。当时,把所有的锁一顿查,没发现原因。后来,单步执行发现是WaitForSingleObject
引起的。
bool cmdDeal(std::string strCmd)
{
PVOID oldValue = NULL;
if (Wow64DisableWow64FsRedirection(&oldValue))
{
SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = "runas";
ShExecInfo.lpFile = "cmd";
ShExecInfo.lpParameters = strCmd.c_str();
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_HIDE;
ShExecInfo.hInstApp = NULL;
bool ret = ShellExecuteEx(&ShExecInfo);
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
}
//WinExec(strtmp,SW_SHOWNORMAL);
if (Wow64RevertWow64FsRedirection(oldValue) == FALSE)
{
return false;
}
return true;
}
WaitForSingleObject(ShExecInfo.hProcess, INFINITE
);
如果,上面传递的执行程序路径有问题,那么就会一直等待!
解决方法
WaitForSingleObject(ShExecInfo.hProcess, 3000
);
WaitForSingleObject解释
WaitForSingleObject是一种Windows API函数。当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的。该句柄必须具有 SYNCHRONIZE 访问权限。
WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。
正常情况下,我们使用WaitForSingleObject做线程的信号等待来做同步。在直接使用时要注意INFINITE
只有对象被触发信号后,函数才会返回。在界面开发中,如果你的界面主线程使用了INFINITE
,那么在处理出错没有返回信号时,进程就会卡死。