3

API は、スレッド化 (以下を参照) やアクティブなドキュメントを閉じる方法を公式にはサポートしていません。とはいえ、アクティブなドキュメントを閉じるための回避策は...を呼び出すことです...

SendKeys.SendWait("^{F4}");

・・・別スレより。いくつかのドキュメントを開いたり閉じたりすることをループする必要があることを除いて、それはうまくいきます。スレッドの後にコードを配置すると、前のドキュメントを閉じる前に実行されます。私はいくつかの標準的なスレッドコールバックメソッドを試しました...

Task.Factory.StartNew(() =>

ThreadPool.QueueUserWorkItem(new WaitCallback

AutoResetEvent.WaitOne()

運がない。そして Thread.Sleep() はエラー/クラッシュを停止するだけです。誰にもアイデアはありますか。

「Revit の内部では、いくつかの選択された孤立した場所でのみマルチプロセッシングを利用しています。現在、これらの場所のいずれにも、Revit API のコードまたはその一部が含まれていません。したがって、オートデスクは、同時に実行されている内部から Revit API を呼び出すことをお勧めしません。並列スレッド. Revit API の一部は、テスト環境でそのようなスレッド化コード内から正常に実行できるように十分に分離されている場合があります. これは、同じソース コードが任意のスレッドに対して機能することを保証するものではありません.モデルまたは状況、または Revit の将来の変更によってこのコードが機能しなくなることはありません。」

    public void OpenFile()
    {
        for (int i = 0; i < 3; i++)
        {
            uiApp.OpenAndActivateDocument(TargetPath(i));

            ThreadPool.QueueUserWorkItem(CloseDocProc);

            //any code here at all opens the next doc without closing the last
        }            
    }

    public void CloseDocProc(object stateInfo)
    {
        SendKeys.SendWait("^{F4}");

        //can run code here
    }
4

3 に答える 3

1

彼らが言ったように、問題はスレッドでした。コールバック メソッドのいずれかを使用すると、その時点でフリーズします。また、スレッド内で実行できる操作は限られています。何があってもドキュメントを開くことはできません。

その答えは、シングルスレッドのタイマーを使用することでした。

System.Windows.Forms.Timer;

約 10 秒ごとに Open() メソッドを呼び出し、タイマーを停止して、カウンターが特定のポイントに達したときにコードの最後のビットを実行します。

于 2012-08-21T20:18:08.693 に答える
1

それがトリックを実行できるかどうかはわかりませんが、おそらく次の手法を使用できます: http://adndevblog.typepad.com/autocad/2012/06/use-thread-for-background-processing.html

AutoCAD用ですが、Revitでも使えると思います。AutoCAD のような Revit API は、マルチスレッドをサポートしていません。API 関数は、メイン スレッドからのみ呼び出す必要があります。

メインスレッドへの呼び出しをマーシャリングするには、if fact が必要です。これを実現する最も簡単な方法は、メイン スレッドで System.Windows.Forms.Control オブジェクトを作成し、ドキュメントを閉じる別のスレッドからその Invoke() を呼び出すことです。

または、Idle Event をクリエイティブな方法で使用することもできます...

于 2012-08-23T15:20:29.477 に答える