2

似ていると思われる他のいくつかの質問を読みましたが、まだ非常に混乱しており、どの回答もうまくいかないようなので、別の質問をすることにしました. ご容赦ください。私はスレッド化などに精通していません。

私が作成しているアプリケーションは、Revit Structure 用のサード パーティのアドインです。それらが機能する方法は、インターフェースを実装するクラスを含むクラスライブラリを持っていることです。それが呼び出されると、アプリケーションが実行されます。

私のツールは印刷ツールで、PDF への印刷を自動化することを目的としています。コードを PdfCreator を使用して PDF を印刷する方法に移行しようとしています (Revit での印刷方法は、プリンターを設定し、API で「印刷」メソッドを呼び出すことです。プリンター)。

PDFCreator には優れた COM インターフェイスがあり、その設定を行うだけでなく、すべてのドキュメントが印刷された後に発生するイベントをサブスクライブできます。印刷メソッドを複数回呼び出しているので、すべてが完了するまで待ってから、コードで何かを実行したいと考えています。

私のロジックは次のようになります。

  1. ユーザーが印刷するものを選択
  2. 印刷ボタンを押す (私の WPF ウィンドウで)
  3. My Code は、PDF クリエーターの設定を行い、イベントをリッスンするように登録します。
  4. Print() api メソッドを呼び出すと、各アイテムを印刷するのに時間がかかります。
  5. 次に、すべての印刷が完了したときにアラートを受け取り、ドキュメントに対して「後処理」を行いたいと考えています。
  6. 後処理には、特にPDFの名前変更/移動が含まれます

私の問題は、印刷メソッドを呼び出すと、コードが PDFcreator イベントを待機せず、そのまま続行して終了することです。つまり、後処理が起動されません。

私がする必要があるのは、ブロックせずに、どうにかしてイベントを待つことです。

他のいくつかの質問を読んだ後、私はこれを試しました:

  • AutoResetEvent を使用し、イベント ハンドラが Set() を呼び出すまで WaitOne を使用します。これはWaitOneでスタックし、継続しませんでした.
  • 特定のクラス変数がイベント ハンドラーによって設定されるまで、Application.DoEvents..
  • イベントにサインアップするために新しいスレッドを作成しようとしましたが、役に立たないようです

新しいスレッドでイベントを発生させ、現在のスレッドに継続するように警告するにはどうすればよいですか? または、イベントが発生するまでコードを待機させるにはどうすればよいですか?

さらに情報が必要な場合はお知らせください。喜んで提供します。

4

1 に答える 1

1

あなたの問題は次のとおりです。その他のライブラリは、イベントを発生させるために実行中のメッセージ ループを必要とします。具体的には、特定のメッセージがメッセージ ループから到着すると、そのメッセージがライブラリにディスパッチされ、イベントが発生します。

呼び出し元のコードで「待機」プリミティブを使用すると、メッセージ ループがブロックされるため、イベントが発生することはありません。あなたのプログラムはブロックされるべきではありません - すべての Windows GUI プログラムが行うように、メッセージ ループを実行し続ける必要があります。

于 2010-06-17T05:46:48.053 に答える