このフォームを更新するために特定のフォームの関数を呼び出すスレッドがあります。タスクが完了すると、スレッドは結果を使用してフォームを更新Synchronize
し、プログラムの実行中にすべて正常に機能します。
スレッドが実行されているときに問題が発生し、アクセス違反が発生したプログラムを閉じます。既にリリースされているスレッド更新フォームが原因でした。フォーム作成 ( への呼び出しApplication->CreateForm
) の順序を並べ替えた後、フォームが更新される前にスレッド コードを保持するフォームが作成されるようになったため、正常に機能しました。破壊の順序は創造の順序と逆のようです。
また、フォーム デストラクタにいくつかのコードを追加して、フォームがスレッド コードでフォームの前に破棄された場合にスレッドが終了するようにしました。そのため、フォームの作成順序やフォーム デストラクタのコードを並べ替えると、問題が解決します。
しかし、私は3つの質問があります:
作成されたフォームが破棄される順序は? 今想定している作成順序の逆ですか?
上記のタスクを実行するためのより良い方法はありますか - スレッドがデータの処理を完了した後にフォーム GUI アイテムを更新します。現在、私はスレッド自体を使用してそれを行っています
Synchronize
が、スレッドの経験がある人はより良いアイデアを持っているかもしれません.CreateForm
私が持っていたもう1つのアイデアは、コンパイラーによって生成された束を削除して手動で作成しCreateForm
、破壊の順序をより適切に制御するために使用するメインフォームのみを作成することでした(Rob Kennedyが提案したように- http://pages.cs.wisc.edu/ ~rkennedy/createform )。一般的なアプリケーションでの動的フォームの作成/破棄のコストはどれくらいですか? フォーム非表示を使用してメモリに保持するか、閉じるときに破棄する方が良いですか?