SemaphoreSlim események kiírása (C#)
2021-11-06T10:59:38+01:00
2021-11-07T13:05:34+01:00
2022-08-12T05:35:28+02:00
helloc
Sziasztok!

Hogyan tudnám tárolni, illetve kiírni azt, hogy a SemaphoreSlim segítségével hány darab videófájl vár még konvertálásra és esetleg azt, hogy jelenleg hány darab videó konvertálása megy a háttérben?

Egyrészt kiszeretném írni ilyen formában egy Label-re: 1/10 (1=fut/10=várakozik), mászrészt az egyik gombot addig szeretném nem használhatóvá tenni, ameddig ezek az értékek nagyobbak a nullánál.

Form1.cs

using System; using System.IO; using System.Diagnostics; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using System.Globalization; namespace FirstApp { public partial class Form1 : Form { public static string path_import = ""; public static string path_export = ""; FileSystemWatcher watcher; SemaphoreSlim semaphore; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { numericUpDown1.Enabled = false; int i = (int)numericUpDown1.Value; semaphore = new SemaphoreSlim(i, i); this.watch(); } private void watch() { watcher = new FileSystemWatcher(); watcher.Path = Form1.path_import; watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; watcher.Filter = "*.mp4"; watcher.Renamed += OnRenamed; watcher.EnableRaisingEvents = true; } private void OnRenamed(object source, RenamedEventArgs e) { Task.Run(async() => { await Task.Delay(1000); await semaphore.WaitAsync(); try { ProcessRenaming(e.FullPath, e.Name); } finally { semaphore.Release(); } }); } private void ProcessRenaming(string fullPath, string name) { var lastPart = fullPath.Split('.').Last(); if (lastPart == "mp4") { File.Move(fullPath, fullPath + ".firstapp"); string nf = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(name); Process prcExecuteFFMPEG = new Process(); prcExecuteFFMPEG.StartInfo.FileName = "ffmpeg.exe"; prcExecuteFFMPEG.StartInfo.Arguments = "-ss 00:00:30 -i "" + fullPath + ".firstapp" -c copy "" + path_export + "" + nf + """; prcExecuteFFMPEG.StartInfo.UseShellExecute = false; prcExecuteFFMPEG.StartInfo.RedirectStandardOutput = true; prcExecuteFFMPEG.StartInfo.CreateNoWindow = true; prcExecuteFFMPEG.Start(); prcExecuteFFMPEG.WaitForExit(); string strOutput = prcExecuteFFMPEG.StandardOutput.ReadToEnd(); File.Delete(fullPath + ".firstapp"); } } } }
Mutasd a teljes hozzászólást!

  • Kell majd két változó:

    private volatile int Waiting = 0; private volatile int Completed = 0;


    Ezt követően, ha elindítasz egy új feladatot, a Waiting-et növeled:

    Interlocked.Increment(ref Waiting);

    Ha egy feladattal kész van, a Waiting-et csökkented, a Completed-et növeled:

    Interlocked.Increment(ref Completed); Interlocked.Decrement(ref Waiting);
    A nyomógombra ugyanez érvényes. Ha feladatot adsz hozzá, akkor automatikusan letiltod. Ha egy feladat elkészül, és a Waiting értéke 0, feloldod. Annyira kell odafigyelni, hogy amikor kész vagy egy feladattal és feloldanád, ellenőrizd, hogy a this.InvokeRequired értéke True-e, és ha igen, this.Invoke-ot kell használnod, hogy delegáld a feladatot a UI szálra. Egyébként mehet simán, Invoke nélkül.
    Mutasd a teljes hozzászólást!
  • A semaphore.CurrentCount azt mutatja, hány szálat engedne be adott pillantban. Tárold el az initcount-ot egy mezőben, amivel a semaphore inicializáva volt, akkor initcount - semaphore.CurrentCount szál fut éppen.
    Mutasd a teljes hozzászólást!
abcd