独立 Windows 应用在焦点更改时挂起
Standalone Windows app hangs upon change of focus
我在 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 版本)
-
进程内调度
这可能会弄乱在旧版本的 Windows 上 100% 线程安全的无锁多线程应用程序。与此没有太大关系(除非添加一些安全睡眠或锁)
-
关键部分
我不是 100% 相信关键部分在 Win7SP1 上正常工作,因为我在特定机器设置上遇到了一些问题,它们无法与以下组合一起使用:
- 重型 USB HS 批量数据传输
- OpenGL 使用
- 具有繁重的多个关键部分的多线程使用
但它可能是隐藏的错误或混乱的 Windows7 安装甚至硬件错误
-
窗口处理器
如果你的消息循环卡住较长时间,那么它应该会导致程序被检测为无响应,即使它不是。 通常以XPSP3的兼容性运行会有所帮助,但遗憾的是,并非所有计算机或所有应用程序都:(这是许多游戏无法在Win7上运行的主要原因
我怀疑这是你的情况,根据你最后的评论,我是对的。
而是将关键处理转移到某个线程,以便
WindowProc
不会被阻塞。如果您在计算完成后需要某个事件,则将某个变量标记为已完成并在某个计时器中扫描它,以便您可以在主线程内响应(以避免主线程外的 winapi 调用)。 -
在 x64 窗口上使用 32 位驱动程序 + 应用程序 (WOW64)
如果你的应用正在访问任何驱动程序,那么在WOW64上,你需要特殊的驱动程序构建来访问真实的硬件,而不是由WOW64模拟!!如果您没有这样做,那么您的应用程序很可能正在等待真实的设备响应,而是被模拟一个可能不同的应用程序并导致真正的挂断。在这种情况下,您需要将应用程序编译为 x64
或者使用某种 WOW64.x86 -> x64 桥接器
或者使用可以自己处理它的驱动程序(通常链接做不同的dll)
- 挂起和取消挂起一个文件DLL
- 如何防止C++遗留代码中的挂起指针
- 为什么所有C++编译器都会崩溃或挂起此代码
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 构建挂起,即使是适度的文件大小
- 循环挂起迭代的 std::擦除 on std::list
- Poco::Net::FTPClientSession 在 open() 方法上挂起 129 秒,如果 ftp 主机不存
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 从不同进程中的另一个线程挂起/恢复线程或进程
- Boost (Beast) websocket:同步写入挂起
- 为什么析构函数挂起
- 使用互斥会挂起程序
- 在C++和 Python 程序中使用命名管道的 IPC 挂起
- 设置变量时C++程序挂起
- 第一次尝试使用new动态创建结构数组,程序挂起没有错误
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 有时ShowWindow从不调用OnShowWindow,主应用程序挂起
- 如何防止GUI挂起,同时允许第二次操作与Qt中的第一次操作一起执行
- QTableWidget不在焦点时挂起/暂停
- 独立 Windows 应用在焦点更改时挂起