当我的程序“无响应”时,为啥我的paintBox Canvas 被擦除了?

Posted

技术标签:

【中文标题】当我的程序“无响应”时,为啥我的paintBox Canvas 被擦除了?【英文标题】:Why is my paintBox Canvas being erased when my program is "Not Responding"?当我的程序“无响应”时,为什么我的paintBox Canvas 被擦除了? 【发布时间】:2010-08-11 16:01:01 【问题描述】:

我使用 Borland 的 C++ builder 编写了一个小程序,一路走来,一切似乎都很好。我的程序有一个地图窗口和一个表格窗口,当用户按下按钮时,会启动一个漫长的过程,读取所有地图和表格信息,然后将其显示出来。每次我通过调试器运行它时,我都没有问题。然后今天,我决定不通过调试器运行它来测试它。令我惊恐的是,该程序读取地图信息,然后将其显示在画布画布上没有问题,但是当它为网格加载信息时,地图被删除了!!!它似乎发生在表的加载阶段。这大约需要 4 秒,在此期间,窗口告诉我它没有响应。这是地图被删除的时候。有人对为什么会这样有任何想法吗?它让我发疯,我真的不明白这里发生了什么。

更新: 我已经在某种程度上解决了这个问题。我四处寻找,发现了这个:Avoiding "(Not Responding)" label in windows while processing lots of data in one lump 我添加了代码以在为表读取的数据中间运行一次。这解决了我的问题。但是,我想知道是否有人知道为什么会这样?为什么我的程序无响应导致我的画布被擦除?

【问题讨论】:

【参考方案1】:

Marcus Junglas 写了一个detailed explanation 的问题,它影响 Delphi 和 C++Builder。

在编写事件处理程序时 Delphi(如 OnClick 事件 TButton), 到时候 您的应用程序需要忙于 一段时间,例如代码需要写 一个大文件或压缩一些数据。

如果你这样做,你会注意到你的 应用程序似乎被锁定。您的 表格不能再移动,并且 按钮没有生命迹象。 好像崩溃了。

原因是一个 Delpi 应用程序 是单线程的。你的代码 写作只代表一堆 调用的程序 Delphi的主线程每当事件发生时 发生。其余时间主要 线程正在处理系统消息和 其他的东西,比如表单和组件 处理函数。

所以,如果你没有完成你的活动 通过做一些冗长的工作来处理, 您将阻止应用程序 处理这些消息。

您可以在加载地图数据时调用Application->ProcessMessages() 来减少问题,但我建议使用单独的线程来加载数据。

【讨论】:

这是一个通用的 Windows 问题。如果主消息线程上发生任何长时间的处理,应用程序将停止响应。【参考方案2】:

我从未使用过 C++ Builder,但我使用的是 Delphi。我认为图书馆是一样的。

您使用的组件是否存储图像数据?它可能只绘制到屏幕上。尝试用另一个窗口覆盖您的应用程序的窗口。如果它擦除它,您必须使用存储图像的组件。

请参阅this,它适用于 Delphi,但它可能会有所帮助。 C++ Builder 中应该有一个 Image 组件。尝试使用它而不是 PaintBox。

您可以通过在单独的线程中运行耗时任务或调用一些处理窗口消息的函数来解决无响应问题。

【讨论】:

以上是关于当我的程序“无响应”时,为啥我的paintBox Canvas 被擦除了?的主要内容,如果未能解决你的问题,请参考以下文章

为啥有响应与无响应的 MTU 不同?

为啥电脑总是显示这个,软件程序总是无响应

为啥我的程序在 nVidia NView 下会消耗 100% CPU?

为啥我的应用程序随着时间的推移变得反应迟钝?

ckeditor 使页面无响应

为啥当我按下返回按钮时我的程序崩溃