Delphi で複数のスレッドが作成された dll ライブラリを作成しています。問題を順を追って説明します。事前の説明が長くなってしまい申し訳ありません:-(。
しばらく図書館のことは忘れましょう。複数のカメラからのビューを表示する Windows アプリケーションを作成しました。単一のカメラからのビューを表示するためのウィンドウを作成しました。ウィンドウには TImage コントロールが含まれています。数ミリ秒ごとにカメラから現在の画像をダウンロードし、そのウィンドウの TImage コントロールに割り当てるスレッド (TThread の子孫) があります (Synchronize() メソッドを使用)。アプリケーションは、起動時にそのウィンドウの複数のインスタンスを (それぞれに別のスレッドで) 作成するため、複数のカメラからのライブ ビューを一度に見ることができます。さらに、これらの表示ウィンドウはすべてメイン アプリケーション ウィンドウの親であり、メイン アプリケーション ウィンドウ内に表示されます。
これらの 2 つのウィンドウを dll ライブラリに入れることを決定するまで、すべてが正常に機能していました。いくつかの理由で必要だと思いましたが、今は重要ではありません。そこで、新しい dll ライブラリを作成し、既存のメイン ウィンドウとカメラ ビュー ウィンドウをプロジェクトに追加し、メイン ウィンドウのインスタンスを作成して返す関数をエクスポートしました。メイン ウィンドウが作成されると、いくつかのカメラ ビュー ウィンドウが作成され、それ自体が親になります。
次に、テスト目的で、上記の dll 関数をライブラリからインポートし、起動時にそれを呼び出してメイン ウィンドウのインスタンスを取得するアプリを作成しました。次に、それを画面に表示します(非モーダル状態)。
アプリを起動すると、どのカメラからも画像を 1 枚も取得できないことがわかりました。デバッグしたところ、スレッドが Synchronize() メソッドを呼び出すと、スレッドが永久にハングすることに気付きました。これらの両方のウィンドウを dll に入れる前は、この問題は発生しませんでした。
そして、これは私の問題です。正直なところ、これはライブラリに対する私の最初のアプローチであり、これまでに他の多くの問題を乗り越えなければなりませんでした。フレームの代わりにウィンドウを使用する理由を不思議に思うかもしれません...そのため、dll で TFrame のインスタンスを作成するたびに、「コントロール xxx には親ウィンドウがありません」という例外が発生します。私はそれについて何をすべきかわからなかったので、代わりにウィンドウを使用しました:-(。
同期の問題の対処法を教えてください。メインスレッドは、ボタンのクリックなどを受け入れるため、アプリケーションが開始されたときにブロックされていないようです。問題は何ですか?
助けてください!
前もって感謝します!!