3

フォルダを監視する小さなトレイアプリを作成しました。新しいファイルが追加されると、ジョブが実行されます。仕事は、ビデオファイルを監視し、handBrakeCliを使用してそれらを.mp4に変換することです。私はこのすべての論理を解決しました。私が遭遇した問題は、複数のファイルがある場合、前のファイルが完了するまでジョブをキューに入れたいということです。私はc#にかなり慣れていないので、これを処理する最善の方法がわかりません。

1つのアイデアは、何らかの方法でキューを作成し、コマンドを順番に格納するファイルを作成し、プロセスの完了後に次のキューを実行することです。ここでは大きなムービーファイルを扱っているので、しばらく時間がかかる場合があります。私は8GBのRAMを搭載したクアッドコアでこれを行っていますが、フルレングスの映画を完成させるのに通常約30分かかるようです。私はこれを行う方法がわかりません。

これが私がこれまでに持っているコードです。ここには将来の機能のためのビットがいくつかあるので、表示されないいくつかのクラスを参照しますが、ここでは使用されていないため、問題ではありません。どんな提案でも大歓迎です。

    public void Watcher()
    {
        FileSystemWatcher watcher = new FileSystemWatcher();

        watcher.Path = textBox1.Text + "\\"; //path to watch
        watcher.Filter = strfilter; //what types to look for set to * and i will filter later as it cant accept an array
        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName; //properties to look at
        watcher.IncludeSubdirectories = true; //scan subdirs
        watcher.Created += new FileSystemEventHandler(OnChanged);

        //TODO: make this only run if the files are of a certain type
        watcher.EnableRaisingEvents = true; // start the watcher
    }

    static bool IsFileLocked(FileInfo file)
    {
        FileStream stream = null;

        try
        {
            stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
        }
        catch (IOException)
        {
            //the file is unavailable because it is:
            //still being written to
            //or being processed by another thread
            //or does not exist (has already been processed)
            return true;
        }
        finally
        {
            if (stream != null)
                stream.Close();
        }

        //file is not locked
        return false;
    }

    // Define the event handlers. 
    private void OnChanged(object source, FileSystemEventArgs e)
    {
        string sFile = e.FullPath;
        //check that file is available
        FileInfo fileInfo = new FileInfo(sFile);
        while (IsFileLocked(fileInfo))
        {
            Thread.Sleep(500);
        }

        if (System.Diagnostics.Process.GetProcessesByName("HandBrakeCLI").Length != 0)
        {
            Thread.Sleep(500);
        }
        else
        {
            //hbOptions hbCl = new hbOptions();
            //hbCli = hbCl.HbCliOptions();
            if (textBox3.Text != "")
            {
                hbCli = textBox3.Text.ToString();
            }
            else
            {
                hbCli = "-e x264 -q 20 -B 160";
            }
            string t = e.Name;
            string s = t.Substring(0, t.Length - 4); //TODO: fix this its not reliable
            file = e.FullPath;
            string opath = textBox1.Text.ToString();
            cmd = "-i \"" + file + "\" -o \"" + opath + "\\" + s + ".mp4\" " + hbCli;

            try
            {
                for (int i = 0; i < Ext.Count(); i++)
                {
                    if (e.Name.Contains(Ext[i]))
                    {
                        Process hb = new Process();
                        hb.StartInfo.FileName = "D:\\Apps\\Handbrake\\Install\\Handbrake\\HandBrakeCLI.exe";
                        hb.StartInfo.Arguments = cmd;

                        notifyIcon.BalloonTipTitle = "Now Converting";
                        notifyIcon.BalloonTipText = file;
                        notifyIcon.ShowBalloonTip(2000);

                        hb.Start();
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }

    private void button1_Click(object sender, EventArgs e) //ok button
    {
        //add each array item to the list 
        for (int i = 0; i < filter.Count(); i++)
        {
            Ext.Add(filter[i]);
        }

        if (textBox1.Text != "" && textBox1.Text.Length > 2)
        {
            Watcher(); //call watcher to run
        }

        this.WindowState = FormWindowState.Minimized;
    }
}
4

1 に答える 1

0

WCF と MsmqQueueBinding を利用したい場合:

  • サービスはNetMsmqBindingを使用します
  • MSMQと呼ばれる組み込みの Windows キューを使用して実装されたキュー(MMC snap-it を使用して、メイン、デッド、ポイズン レター キューを制御できます。クライアントとサーバーの両方の Windows OS がバンドルされており、 Windowsの機能でオンにします) 。
  • クライアントはプロセス要求をキューに入れ、それを忘れる
  • サービスが自動的に受け取り、処理します
  • キューは耐久性があり、永続的で、トランザクション対応です (必要に応じて)
  • 同じマシンまたは別のイントラネット サーバーでキューを実行できます。

次のすばらしいチュートリアルを参照してください。

于 2012-11-16T05:05:06.257 に答える