private static void RunSingleThread(IEnumerable <string> args) { List <string> validEntries = new List <string>(); foreach (string arcFile in args) { if (!File.Exists(arcFile)) { Logger.Warn($"{arcFile} is not a file"); continue; } if (!ArcFileSystem.DetectMagic(arcFile)) { Logger.Warn($"{arcFile} is not a valid ARC file."); continue; } validEntries.Add(arcFile); } DumpWorker worker = new DumpWorker(null, validEntries); worker.StartWork(null); if (MergeType == MergeType.SingleFile) { WriteAllSubtitles(worker); } }
private static void DumpSubtitles(IReadOnlyCollection <string> arcFiles) { int filesPerThread = arcFiles.Count / MaxThreads; if (MaxThreads == 1 || filesPerThread <= 1) { RunSingleThread(arcFiles); return; } DumpWorker[] workers = new DumpWorker[MaxThreads]; WaitHandle[] doneEvents = new WaitHandle[MaxThreads]; int workerid = 0; List <string> workList = new List <string>(); foreach (string arcFile in arcFiles) { if (!File.Exists(arcFile)) { Logger.Warn($"{arcFile} is not a file"); continue; } if (!ArcFileSystem.DetectMagic(arcFile)) { Logger.Warn($"{arcFile} is not a valid ARC file."); continue; } workList.Add(arcFile); if (workList.Count >= filesPerThread) { ManualResetEvent doneEvent = new ManualResetEvent(false); doneEvents[workerid] = doneEvent; workers[workerid++] = new DumpWorker(doneEvent, workList); workList = new List <string>(); } } if (workList.Count != 0) { ManualResetEvent doneEvent = new ManualResetEvent(false); doneEvents[workerid] = doneEvent; workers[workerid] = new DumpWorker(doneEvent, workList); } foreach (DumpWorker dumpWorker in workers) { ThreadPool.QueueUserWorkItem(dumpWorker.StartWork, null); } WaitHandle.WaitAll(doneEvents); if (MergeType == MergeType.SingleFile) { WriteAllSubtitles(workers); } }