在Windows XP上运行VS2013时,CEvent无法发出信号

时间:2014-11-20 05:13:46

标签: c++ visual-studio-2013 mfc windows-xp

我的本​​机C ++ / MFC程序在使用VS2005编译时运行并在32位Windows XP上运行。使用Visual Studio 2013 - Windows XP(v120_xp)平台工具集*,使用VS2013编译的相同代码在64位Windows 7下运行,但在32位Windows XP上运行失败。我正在使用MBCS MFC库。这两个版本都是调试版本。

失败的代码是事件的信号:

// At global scope
CEvent interpHasWork(FALSE/* bInitiallyOwn*/,FALSE/*bManualReset*/,"InterpHasWork"); 

// In function A
interpHasWork.SetEvent(); // signal

// and in function B
interpHasWork.Lock(); // wait for signal

在构建它的VS2013机器(64位Windows 7)上运行时,在功能A中发出事件信号后,功能B退出锁定状态(继续执行下一行),如预期的那样。 / p>

当在Windows XP计算机上运行相同的可执行文件时,在函数A中发出事件信号后,函数B永远不会退出锁定状态。

所以,问题是,如何构建程序以使可执行程序与两种操作系统兼容?

编辑:结果是答案是,包含函数B的线程从未启动过,因为AfxBeginThread出错了(我的pgm没有检查[BAD pgm])。确定它出错的确切原因是棘手的,因为没有AfxBeginThread的错误返回文档,并且AfxBeginThread最终调用创建线程的CreateThread被记录为使用GetLastError。但GetLastError(我的帮助文件中未记录)返回0 =成功。然而,errno返回12(内存不足)。

由于堆栈保留设置为~500 MB,并且AfxBeginThread使用了默认堆栈大小,因此它还请求了大约500 MB的保留。当使用VS2005构建pgm时,所有这些都有效,所以我假设VS2013产生了更大的可执行文件。我将工作线程的堆栈大小减少到1MB,但仍然出现错误,因此VS2005版本必须几乎不适合XP的2 GB用户空间。

*如果我使用默认的v120工具集,程序会给出"不是有效的Win32程序"启动时的消息。

0 个答案:

没有答案