Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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);
            }
        }