2

Flash コントロールを使用してムービーを再生する C# プログラムがあります。私が抱えている問題は、ムービーが完全に読み込まれる前に Actionscript にメッセージを送信しようとすると、エラーが発生することです。この問題を解決するために、続行する前に 1 秒待機するようにタイマーを設定しました。別のスレッドで実行しているため、別の問題が発生しました。この問題を解決するために、タイマー イベント ハンドラーで Invoke を使用してみましたが、何らかの理由で実際にメソッドを呼び出していないようです。CPU の 50% がプロセスによって使用されていることがわかりますが、Invoke ステートメントから戻ってくることはありません。私は多くの質問を見て、Invoke メソッドと BegainInvoke メソッドを使用する 4 つまたは 5 つの異なる方法を試しました。私のアプリケーションの設計では、フォームをインスタンス化するメイン クラスがあります。フォームのコンストラクターが読み込まれ、ムービーの再生が開始されます。メイン クラスはタイマーを設定し、問題が発生するフォームを表示しようとします。

    public MyClass()
    {
        demoForm = new DemoForm();

        timer.Elapsed += new ElapsedEventHandler(engine);

        timer.Interval = 1000;
        timer.Enabled = true;

        for (int i = 0; ; i++)
            counter++;
    }

    private void engine(Object source, ElapsedEventArgs e)
    {

        timer.Enabled = false;

        if (demoForm.InvokeRequired)
        {
            demoForm.BeginInvoke(new MethodInvoker(sendNextMessage));
        }
        else
        {
            sendNextMessage();
        }

    }

    private void sendNextMessage()
    {
        // It never gets here!!!
    }
4

1 に答える 1

3

これは無限のビジー ループです。

  for (int i = 0; ; i++)
        counter++;

オブジェクトの構築は決して完了せず、おそらく GUI スレッドをブロックしているため、Invoke.

デュアル コア プロセッサを使用しているため、おそらく 50% の CPU 使用率が表示されます。コアの 1 つがビジー ループにあり、カウンターを繰り返しインクリメントしています。他のコアはアイドル状態です。

アプリケーションの終了を防ぐためにループを使用していたとのことですが、これは正しい方法ではありません。Application.Runmain メソッドから呼び出す必要があります。新しい Windows フォーム プロジェクトを作成すると、Visual Studio によってこのコードが自動的に追加されます。

提案

2 つのフォームを作成します。Flash コントロールを独自のフォームに配置し、そのフォームを最初に表示します。そのフォームが閉じられたら、2 番目のフォームを開いてアプリケーションの残りの部分を表示できます。

于 2012-08-20T20:38:15.120 に答える