c++ - 独立的 Windows 应用程序在焦点改变时挂起

标签 c++ windows multithreading windows-7

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

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

[Spektre 的 Edit1] 刚刚从评论中复制了 user3481340 的代码以便于阅读

  • 我不认为计算时间,大约一个小时
  • 与问题有关。
  • 相反,编辑框的 Windows 消息传递变得困惑。
  • 相关代码为:

    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% 线程安全。与此没有太大关系(除非添加一些安全 sleep 或锁)

  2. 关键部分

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

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

    但它可能是一个隐藏的错误或搞砸了 Windows7 安装甚至硬件错误

  3. 窗口处理

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

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

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

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

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

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

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

关于c++ - 独立的 Windows 应用程序在焦点改变时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22764604/

相关文章:

Java 将 int[] 列表转换为 int[] 数组 - 并发安全

multithreading - 线程、Coro、Anyevent 混淆

c++ - 我需要在 pthread_mutex_destroy 之后使用 delete

C++ UDP recvfrom 行为异常,WSAGetLastError = 10014

xml - 用于创建本地用户并将详细信息写入 XML 文件的 Powershell 脚本

python - 在 Windows 上安装 rasa

node.js - npm 错误!错误 : EPERM: operation not permitted, 重命名

python - 在 pygmo 中使用队列进行函数评估

c++ - 如何在不同线程中同时运行多个 QDialogs?

c++ - 在宏中使用 char* 变量的值