独立 Windows 应用在焦点更改时挂起

Standalone Windows app hangs upon change of focus

本文关键字:挂起 焦点 Windows 应用 独立      更新时间:2023-10-16

我在 Visual Studio 2008 的 C++ 中编写了一个应用程序,在 Windows 7 上运行,在调试器控制下使用调试或发布版本运行良好,但是当独立运行时,使用调试或发布版本,它也运行良好,除非每当我单击任何不相关的窗口时,例如文件资源管理器窗口, 因此,应用程序在没有来自 Windows 的任何警告的情况下挂起,我看到了小圆圈的东西。

该代码正在做一些计算密集型的事情,从 10Mb 全局数组访问数据,并且完全在 32 位 Windows 的 2Gb 限制范围内。 我已经检查了明显的东西,例如未初始化的变量、无限循环等,我没有分配任何大的局部数组,但没有发现任何错误。 代码直接从 UI 线程运行,阻塞,但我不在乎,因为在任务完成之前没有其他事情可做。 或者,我可以将此代码放在它自己的工作线程中,通过互锁缓冲区与 UI 线程通信,但这似乎是多余的。 我已经在运行Windows 7的两台不同计算机上尝试过此操作,并获得了相同的行为。 关于 Windows 进程管理,我是否忽略了一些东西? 有没有办法判断是否存在某种内存损坏,可能导致其他进程影响应用程序的进程?

[Edit1 by spektre] 刚刚从注释中复制了 user3481340 的代码以可读

  • 我不认为计算时间,大约是一个小时
  • 与问题有关。
  • 相反,编辑框的窗口消息变得混乱。
  • 相关代码为:

    int textlen=GetWindowTextLength(Editwin);
    int k=strcspn(messagebuf,"n");
    if(k<strlen(messagebuf))textlength=strlen(messagebuf)-k;
     else textlength+=k;
    SendMessage (Editwin, EM_SETSEL, (WPARAM)textlen, (LPARAM)textlen);
    SendMessage (Editwin, EM_REPLACESEL, 0, (LPARAM) messagebuf);
    
  • 不知何故,Windows 停止响应这些消息。

Windows7 有一些变化(从以前的 Windows 版本)

  1. 进程内调度

    这可能会弄乱在旧版本的 Windows 上 100% 线程安全的无锁多线程应用程序。与此没有太大关系(除非添加一些安全睡眠或锁)

  2. 关键部分

    我不是 100% 相信关键部分在 Win7SP1 上正常工作,因为我在特定机器设置上遇到了一些问题,它们无法与以下组合一起使用:

    • 重型 USB HS 批量数据传输
    • OpenGL 使用
    • 具有繁重的多个关键部分的多线程使用

    但它可能是隐藏的错误或混乱的 Windows7 安装甚至硬件错误

  3. 窗口处理器

    如果你的消息循环卡住较长时间,那么它应该会导致程序被检测为无响应,即使它不是。 通常以XPSP3的兼容性运行会有所帮助,但遗憾的是,并非所有计算机或所有应用程序都:(这是许多游戏无法在Win7上运行的主要原因

    我怀疑这是你的情况,根据你最后的评论,我是对的。

    而是将关键处理转移到某个线程,以便WindowProc不会被阻塞。如果您在计算完成后需要某个事件,则将某个变量标记为已完成并在某个计时器中扫描它,以便您可以在主线程内响应(以避免主线程外的 winapi 调用)。

  4. 在 x64 窗口上使用 32 位驱动程序 + 应用程序 (WOW64)

    如果你的应用正在访问任何驱动程序,那么在WOW64

    上,你需要特殊的驱动程序构建来访问真实的硬件,而不是由WOW64模拟!!如果您没有这样做,那么您的应用程序很可能正在等待真实的设备响应,而是被模拟一个可能不同的应用程序并导致真正的挂断。在这种情况下,您需要将应用程序编译为 x64

    或者使用某种 WOW64.x86 -> x64 桥接器

    或者使用可以自己处理它的驱动程序(通常链接做不同的dll)