13

私は問題があります。スレッドを使用する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;
4

2 に答える 2

12

考えられる理由は、スレッドからGUIへの非同期アクセスです。あなたはスレッドがそれをしないと言いましたがTRunThread.Execute、最良の推測のように見えるソースコードを見ることはありません。

于 2011-06-15T08:06:01.040 に答える
1

私は同じ問題、エラーコード5を持っていましたAccess is denied。これは、(を使用して)埋め込みパネルでインターネット接続のテストを開始したスレッドに関連していることが判明しましたBeginThread。ユーザーがフォームを表示した直後に(インターネット接続をテストしている)フォームを終了すると、AVが発生します。

私の開発用PCでは、インターネット接続テストは成功しました...そして、とても速く、私は問題を見たことがありませんでした!数時間苦労した後、ようやくこのスレッドまで追跡し、ネットワークケーブルを外して再現しました。

解決策は簡単でした。フォームを終了するとき(たとえば、FormDestroyイベントの場合)、続行する前にスレッドが確実に実行されていないことを確認してください。

于 2017-07-20T13:20:29.440 に答える