public GeneratorState(GameDataMBIN.Table table, string[] files, StreamWriter logStream = null)
 {
     this.Table     = table;
     this.files     = files;
     this.next      = 0;
     this.Finished  = 0;
     this.LogStream = logStream;
 }
        public void GenerateGameDataMBINTable()
        {
            // TODO: HACK, for debugging the test
            // Change MAX to restrict how many files will be processed.
            // For unrestricted, set to int.MaxValue
            const int MAX = int.MaxValue; // TODO FIXME! should be int.MaxValue;

            var table = new GameDataMBIN.Table();

            if (File.Exists(table.FilePath))
            {
                throw new APIException($"A {table.Name} table already exists!\n{table.FilePath}");
            }

            string[] files = Directory.GetFiles(RunSettings.GameDataDir, "*.MBIN*", SearchOption.AllDirectories);
            Array.Resize(ref files, Math.Min(MAX, files.Length));

            CurrentState = new GeneratorState(table, files);

            string logPath = Logger.GetLogPath("GameDataMBIN.log");

            using (CurrentState.LogStream = new StreamWriter(logPath)
            {
                AutoFlush = true
            }) {
                int maxThreads = RunSettings.MaxConcurrentThreads;
                this.runners = new ThreadRunner[maxThreads];
                for (int i = 0; i < maxThreads; i++)
                {
                    string file = CurrentState.NextFile();
                    if (file == null)
                    {
                        break;
                    }
                    runners[i] = new ThreadRunner(file, OnThreadFinished);
                    new Thread(new ThreadStart(runners[i].Execute)).Start();
                }

                while (!CurrentState.IsFinished)
                {
                    Thread.Sleep(10);                                  // ms
                }
                table.Save();
            }
        }