簡體   English   中英

“EOSError 1400 - 無效的 window 句柄”的可能原因

[英]Possible causes of “EOSError 1400 - Invalid window handle”

我有個問題。 我有一個使用線程的 VCL 應用程序。 該線程進行一些計算並通過 Synchronize() 調用 MainForm 的方法。 一切正常,我有一個“開始”按鈕,用於創建和運行線程,還有一個“停止”按鈕,用於停止和釋放它。 沒有錯誤,什么都沒有。

但是由於某種原因,當我關閉應用程序並運行線程時,我得到一個EOSError 1400 - Invalid window handle 我已經為 OnClose 程序設置了斷點,我唯一要做的就是保存一個 ini 文件,沒有錯誤,當我進一步跟蹤時(使用 F7),我到達了最后( Application.Run; end. ),之后“呼喚” end. 我得到了錯誤,所以沒有特定的代碼行來提高它。

我希望這個問題有點清楚,我希望它是可以解決的,因為只是忽略錯誤似乎有點不干凈。

謝謝 inb4


回答

當調用線程的 Execute 方法時,我發生了這個錯誤,它看起來像這樣:

procedure TRunThread.Execute;
var (...)
begin
  while not Terminated do begin
    (...)
    MainForm.Memo1.Lines.Add('Some text'); // Even though this call worked fine during
    //the application running, it caused errors on shutting the app down.
    // For acccessing GUI elements, it's necessary to use Synchronize()
    (...)
  end;
end;

一個可能的原因是線程對 GUI 的一些不同步訪問。 您說線程不這樣做,但是沒有看到看起來像最好猜測的TRunThread.Execute源代碼。

我有同樣的問題,錯誤代碼 5 Access is denied 事實證明,這與開始在嵌入式面板上測試互聯網連接的線程有關(使用BeginThread )。 如果用戶在顯示表單后立即退出表單(正在測試互聯網連接),則會發生 AV。

在我的開發 PC 上,互聯網連接測試成功......而且速度如此之快,經過幾個小時的努力,我從未發現過問題。 我終於將它追蹤到這個線程並通過斷開我的網絡電纜來重現它。

解決方案很簡單:退出表單時(例如在FormDestroy事件中)確保線程在繼續之前絕對沒有運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM