diff options
author | Michał Klichowicz <emkael@tlen.pl> | 2023-11-05 18:08:51 +0100 |
---|---|---|
committer | Michał Klichowicz <emkael@tlen.pl> | 2023-11-05 18:08:51 +0100 |
commit | 50f18e08e71fef4992fb7df32fdee8ac142f181a (patch) | |
tree | d3fab74ec9746a6da4d46760e325861b08932c61 /src/BCDDFile.cs | |
parent | 86b5e6fab4f7d223d30f0b370020a6ba42cb8d05 (diff) |
Parallel per-board processing
Diffstat (limited to 'src/BCDDFile.cs')
-rw-r--r-- | src/BCDDFile.cs | 107 |
1 files changed, 66 insertions, 41 deletions
diff --git a/src/BCDDFile.cs b/src/BCDDFile.cs index a37ead6..f0e7522 100644 --- a/src/BCDDFile.cs +++ b/src/BCDDFile.cs @@ -8,14 +8,19 @@ namespace BCDD { public List<String> errors; private String filename; + private PBNFile file; public static int filesCounter; public static ManualResetEvent filesCountdown = new ManualResetEvent(false); + private int boardCount; + private ManualResetEvent boardCountdown; + public BCDDFile(String filename) { this.errors = new List<String>(); this.filename = filename; + this.file = new PBNFile(filename); } private void error(String message, String boardNo = "") @@ -32,53 +37,68 @@ namespace BCDD Console.WriteLine("ERROR: " + message); } + private void info(String boardNo, String ddTable, ParContract contract) + { + Console.WriteLine(String.Format("[{0}:{1}] {2} {3}", this.filename, boardNo, ddTable, contract)); + } + + private void processBoard(object state) + { + PBNBoard board = state as PBNBoard; + DDTable table = new DDTable(board); + String boardNo; + try + { + boardNo = board.GetNumber(); + } + catch (FieldNotFoundException) + { + boardNo = "?"; + } + try + { + int[,] ddTable = table.GetDDTable(); + if (ddTable != null) + { + ParScore par = new ParScore(board); + ParContract contract = par.GetParContract(ddTable); + board.SaveDDTable(ddTable); + board.SaveParContract(contract); + this.info(boardNo, DDTable.ShortFormat(ddTable), contract); + } + else + { + this.error("unable to determine DD table for board " + boardNo, boardNo); + } + } + catch (DllNotFoundException) + { + throw; + } + catch (Exception e) + { + this.error(e.Message, boardNo); + } + finally + { + if (Interlocked.Decrement(ref this.boardCount) == 0) + { + this.boardCountdown.Set(); + } + } + } + public void analyze(object state) { try { - PBNFile file = new PBNFile(filename); - foreach (PBNBoard board in file.Boards) + this.boardCount = this.file.Boards.Count; + this.boardCountdown = new ManualResetEvent(false); + foreach (PBNBoard board in this.file.Boards) { - DDTable table = new DDTable(board); - String boardNo; - try - { - boardNo = board.GetNumber(); - } - catch (FieldNotFoundException) - { - boardNo = "?"; - } - try - { - int[,] ddTable = table.GetDDTable(); - if (ddTable != null) - { - ParScore par = new ParScore(board); - ParContract contract = par.GetParContract(ddTable); - board.SaveDDTable(ddTable); - board.SaveParContract(contract); - Console.WriteLine("Board " + boardNo); - DDTable.PrintTable(ddTable); - Console.WriteLine(contract); - Console.WriteLine(); - } - else - { - this.error("unable to determine DD table for board " + boardNo, boardNo); - } - } - catch (DllNotFoundException) - { - throw; - } - catch (Exception e) - { - this.error(e.Message, boardNo); - } - file.WriteBoard(board); + ThreadPool.QueueUserWorkItem(new WaitCallback(this.processBoard), board); } - file.Save(); + boardCountdown.WaitOne(); } catch (DllNotFoundException) { @@ -91,6 +111,11 @@ namespace BCDD } finally { + foreach (PBNBoard board in this.file.Boards) { + this.file.WriteBoard(board); + } + Console.WriteLine(String.Format("Saving file {0}", this.filename)); + this.file.Save(); if (Interlocked.Decrement(ref BCDDFile.filesCounter) == 0) { BCDDFile.filesCountdown.Set(); |