1

外部プログラムを使用してC#で実行するこの圧縮ビデオタスクがあります。この圧縮が完了してファイルが書き出されるまでには、しばらく時間がかかります。外部操作が終了するまで、次のコードを実行したくありません。

単純な Thread.sleep(推測); を実行したいですか? そして次のコード行を実行しますか、それとももっと良い方法がありますか?

これは私がビデオの圧縮を行っている方法です:

 try
        {
            String finalCommand = "";
            String thePath = System.IO.Path.GetDirectoryName(fileName);
            finalCommand ="-i " + fileName + " -s 320x240 -b 300k -r 30 -f avi " + thePath + "\\C" + System.IO.Path.GetFileName(fileName);
            System.Diagnostics.ProcessStartInfo ffmpegcmd = new System.Diagnostics.ProcessStartInfo(Application.StartupPath + "\\ffmpeg.exe",
                 "-i \""  +  fileName + "\" -s 320x240 -b 300k -r 30 -f avi \"" + thePath + "\\C" + System.IO.Path.GetFileName(fileName) + "\"");

            ffmpegcmd.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            System.Diagnostics.Process p = System.Diagnostics.Process.Start(ffmpegcmd);
            LogUtil.writeLog("About to wait for FFMPEGCMD process");
            p.WaitForExit();
            success = true;
            LogUtil.writeLog("FFMPEGCMD process exited perfectly!");
        }
        catch (Exception ex)
        {
            LogUtil.writeLog("ERROR compressing and using FFMPEG");
            success = false;
        }

これがプロセス/スレッドを独自に実行しているかどうかはわかりませんが、うーん。

4

4 に答える 4

3

新しいスレッドを使用している場合は、次のように呼び出すことができますThread.Join:

Thread.Join(otherThread);

...おそらくタイムアウトがあります。

.NET 4 では、Task Parallel Library を使用して (Taskまたはを作成Task<TResult>)、 を呼び出すことができますWait。(.NET 4 を使用している場合、TPL は間違いなく一般的な方法です。TPL を使用すると、多くのことができます。)

これらのアプローチはどちらもブロックしています。他のタスクが完了するまで、待機中のスレッドが他のことをするのを止めます。これは、UI スレッドで行いたいことではありません。したがってこれがユーザー インターフェイスのコンテキスト内にある場合は、代わりにコールバックを使用するのが最善です。完了したら、他のタスクを UI スレッドにコールバックさせます。次のコードを開始できます。

編集:あなたが示したコードは、新しいスレッドではなく、新しいプロセスを作成しています。新しいスレッドでそれを行っている可能性もありますが、それを示していません。また、これがすべて Windows フォームや WPF などの UI で行われているのか、それとも単なるコンソール アプリなのかはまだ不明です。

于 2011-09-01T05:30:11.387 に答える
0

田野が提案したスリープの提案はしません...別のスレッドを待つためだけにCPUを占有する理由はありません(ビジーウェイト)。ジョンの提案はあなたが必要とするものです。

何らかの理由で圧縮スレッドが終了しない場合は、reset eventsを使用することをお勧めします。こちらをご覧ください

于 2011-09-01T05:53:07.923 に答える
0
   Public void compressVideo(obkect o)
   {
      \\ code
    }

    Thread t = new Thread( new threathStart( \\ pass the method that you want to execute on this thread...
    t.start(parameterYouWishtoPas);
    while(t.IsAlive)
    {
       Thread.sleep(1);
     }
     \\ this line will not execute untill thread t finishes executing...
于 2011-09-01T05:40:03.437 に答える
0

msdn: Task Parallel Libraryをご覧ください。

于 2011-09-01T05:30:26.567 に答える