summaryrefslogtreecommitdiff
path: root/src/BCDDFile.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/BCDDFile.cs')
-rw-r--r--src/BCDDFile.cs107
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();