我使用Borland的C ++构建器编写了一个小程序,顺便说一句,一切似乎都很好。我的程序有一个地图窗口和一个表格窗口,当用户按下按钮时,会启动一个长进程,读取所有地图和表格信息,然后显示该信息。每次我通过调试器运行它,我都没有问题。然后今天,我决定测试它而不通过调试器运行它。令我恐惧的是,该程序读取地图信息,然后在没有问题的情况下将其显示在paintbox画布上,但是当它加载网格的信息时,地图会被删除!它似乎发生在表的加载阶段。这需要大约4秒钟,在此期间,窗口告诉我它没有响应。这是地图被删除的时候。任何人都有任何关于为什么会这样的想法?它让我疯狂,我真的不明白这里有什么。
更新:
我已经在某种程度上解决了这个问题。我在四处寻找并发现:Avoiding "(Not Responding)" label in windows while processing lots of data in one lump
我添加了代码,在读入数据的中间运行一次。这解决了我的问题。但是,我想知道是否有人知道为什么会这样?为什么我的程序没有响应导致我的画布被删除?
答案 0 :(得分:4)
Marcus Junglas写了一个问题的detailed explanation,它影响了Delphi和C ++ Builder。
在中编写事件处理程序时 Delphi(就像一个OnClick事件 TButton),有时间 你的应用程序需要忙碌 一段时间,例如代码需要编写 一个大文件或压缩一些数据。
如果你这样做,你会注意到你的 应用程序似乎被锁定。您的 形式不能再移动了 按钮显示没有生命迹象。 它似乎崩溃了。
原因是Delpi应用程序 是单线程的。你是代码 写作代表了一堆 被称为的程序 每当一个事件发生时,Delphi的主线程 发生。剩下的时间主要是 线程正在处理系统消息和 形式和组件等其他东西 处理功能。
所以,如果你没有完成你的活动 通过做一些冗长的工作来处理 你会阻止申请 处理这些消息。
您可以在加载地图数据时通过调用Application->ProcessMessages()来减少问题,但是我建议使用单独的线程来加载数据。
答案 1 :(得分:2)
我从未使用过C ++ Builder,但我使用的是Delphi。我认为这些库是一样的。
您使用的组件是否存储图像数据?它可能只画到屏幕上。尝试用另一个窗口覆盖应用程序的窗口。如果它将其删除,则必须使用存储图像的组件。
请参阅this,它适用于Delphi,但它可能有所帮助。 C ++ Builder中应该有一个Image组件。尝试使用它而不是PaintBox。
您可以通过在单独的线程中运行耗时的任务或调用处理窗口消息的某个函数来解决无响应的问题。