public GeneratorState(GameDataFile.Table table, string[] files, StreamWriter logStream = null) { this.Table = table; this.files = files; this.next = 0; this.Finished = 0; this.LogStream = logStream; }
public void GenerateGameDataFileTable() { // 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;// 10000; // TODO FIXME! should be int.MaxValue; var table = new GameDataFile.Table(); if (File.Exists(table.FilePath)) { throw new APIException($"A {table.Name} table already exists!\n{table.FilePath}"); } string[] files = Directory.GetFiles(RunSettings.GameDataDir, "*", SearchOption.AllDirectories); Array.Resize(ref files, Math.Min(MAX, files.Length)); CurrentState = new GeneratorState(table, files); string logPath = Logger.GetLogPath("GameDataFiles.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(); } }