2010-08-11 70 views
3

我已經使用Borland的C++ builder編寫了一個小程序,一路上,一切似乎都很好。我的程序有一個地圖窗口和一個表格窗口,當用戶按下一個按鈕時,開始一個長時間的過程,讀入所有地圖和表格信息,然後顯示它。每次我通過調試器運行時,我都沒有問題。然後今天,我決定測試它,而不通過調試器運行。令我驚駭的是,程序讀入地圖信息,然後將其顯示在油漆盒畫布上,但沒有問題,但是當它加載網格信息時,地圖會被擦除!它似乎發生在表的加載階段。這需要大約4秒鐘,在這段時間內,窗口告訴我它沒有響應。這是當地圖被擦除時。任何人有任何想法,爲什麼發生這種情況?它驅使我瘋狂,我真的不明白這裏引擎蓋下發生了什麼。當我的程序「無響應」時,爲什麼我的paintBox畫布被擦除?

更新:
我已經在一定程度上解決了這個問題。我正在四處尋找並發現:Avoiding "(Not Responding)" label in windows while processing lots of data in one lump
我添加了代碼,以便在表中讀入的數據中間運行一次。這固定了我的問題。但是,我想知道是否有人知道爲什麼會出現這種情況?爲什麼我的程序無響應導致我的畫布被擦除?

回答

4

Marcus Junglas寫了一個detailed explanation的問題,它影響到Delphi和C++ Builder。

當編程 德爾福事件處理程序(如 TButton的的OnClick事件),總會有時間的時候 您的應用程序需要爲 一會兒,例如忙該代碼需要編寫一個大文件或壓縮一些數據。

如果你這樣做,你會注意到你的 應用程序似乎被鎖定。您的 表單不能再移動,並且 按鈕顯示沒有生命跡象。 它似乎崩潰了。

原因是Delpi應用程序 是單線程的。你寫的代碼 只代表 過程,當 事件發生時,由Delphi的主線程調用 過程。其餘時間主線程處理系統消息 和 其他東西如窗體和組件 處理函數。

所以,如果你沒有做一些冗長的工作, 完成您的活動 處理,你會阻止應用程序 處理這些消息。

在加載地圖數據時,您可以通過調用Application->ProcessMessages()來減少此問題,但我建議使用單獨的線程來加載數據。

+1

這是一個通用的Windows問題。如果任何長處理髮生在主消息傳遞線程上,應用程序將停止響應。 – 2010-08-31 15:25:12

2

我從來沒有使用C++ Builder,但我使用Delphi。我認爲這些圖書館是一樣的。

您使用的組件是否存儲圖像數據?它只能畫到屏幕上。嘗試用另一個窗口覆蓋應用程序的窗口。如果它擦除它,則必須使用存儲圖像的組件。

請參閱this,它適用於Delphi,但它可能有所幫助。 C++ Builder中應該有一個Image組件。嘗試使用,而不是PaintBox。

您可以通過在單獨的線程中運行耗時的任務或調用某個處理窗口消息的函數來解決unresponsivenes問題。

相關問題