protected void ParallelWork(int n) { int i = 0; int m = (Count.HasValue ? Count.Value : Files.Length); ThreadStart work = () => { var p = new RagelParser(); p.AddEvent((_) => { }); while (i < m) { Tuple<FileInfo, ArraySegment<byte>> tmp; if (files.TryDequeue(out tmp)) { ReadFile(p, tmp); i++; } } }; Thread[] threads = new Thread[n]; for (int j = 0; j < threads.Length; j++) { threads[j] = new Thread(work); threads[j].Start(); } foreach (var thread in threads) { thread.Join(); } }
public override void ReadLine(RagelParser parser, ArraySegment<byte> line) { parser.Parse(line); }
public override void ReadLine(RagelParser parser, ArraySegment<byte> line) { if (!parser.Parse(line)) { Console.WriteLine(Encoding.ASCII.GetString(line)); } }
protected virtual void ReadFile(RagelParser parser, Tuple<FileInfo, ArraySegment<byte>> data) { ReadFile(parser, data.Item1, data.Item2); }
public abstract void ReadLine(RagelParser parser, ArraySegment<byte> line);
protected virtual void ReadFile(RagelParser parser, FileInfo fi, ArraySegment<byte> file) { int start = file.Offset; int end = file.Offset + file.Count; int pos = start; byte[] data = file.Array; for (int j = start; j < end; j++) { if (data[j] == '\n') { ReadLine(parser, new ArraySegment<byte>(data, pos, j - pos)); j++; pos = j; } } }