diff defical-sharp/defical-gui/threader.cs @ 0:ebed2bd0d300

Initial import from svn. History be damned.
author Edho P. Arief <me@myconan.net>
date Fri, 02 Apr 2010 23:11:57 +0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/defical-sharp/defical-gui/threader.cs	Fri Apr 02 23:11:57 2010 +0700
@@ -0,0 +1,91 @@
+using System.Threading;
+
+namespace defical_gui
+{
+    public partial class main
+    {
+        private void go()
+        {
+            this.isProcessing = true;
+            int numThreads = (System.Environment.ProcessorCount * 3)/2;
+            Thread[] threads = new Thread[numThreads];
+            int start;
+            int end = 0;
+            txtResult.Dispatcher.BeginInvoke(new StringDelegate(printMessage), new object[] { 200, "" });
+            for (int i = 0; i < numThreads; i++)
+            {
+                threads[i] = new Thread(goBT);
+                threads[i].IsBackground = true;
+                start = end + 1;
+                end = start + ((this.numVerMain + this.numVerDef + 1) / 2) / numThreads;
+                if (i == numThreads - 1) { end = (this.numVerMain + this.numVerDef + 1) / 2; }
+                threads[i].Start(new int[] { start, end, i });
+            }
+            while (this.isProcessing)
+            {
+                Thread.Sleep(100);
+                if (!this.isProcessing) { break; }
+                bool threadIsProcessing = true;
+                switch (this.isFindEverything)
+                {
+                    case true:
+                        {
+                            threadIsProcessing = false;
+                            for (int i = 0; i < numThreads; i++)
+                            {
+                                if (threads[i].IsAlive)
+                                {
+                                    threadIsProcessing = true;
+                                    break;
+                                }
+                            } 
+                            break;
+                        }
+                    case false:
+                        {
+                            threadIsProcessing = true;
+                            for (int i = 0; i < numThreads; i++)
+                            {
+                                if (!threads[i].IsAlive)
+                                {
+                                    threadIsProcessing = false;
+                                    break;
+                                }
+                            }
+                            break;
+                        }
+                }
+                this.isProcessing = threadIsProcessing;
+            }
+            txtResult.Dispatcher.BeginInvoke(new StringDelegate(printMessage), new object[] { 201, "" });
+            for (int i = 0; i < numThreads; i++)
+                if (threads[i].IsAlive)
+                    threads[i].Abort();
+        }
+        private void goBT(object o)
+        {
+            int[] args = o as int[];
+            int start = args[0];
+            int end = args[1];
+            int threadID = args[2];
+            for (int i = start; i <= end; i++)
+            {
+                if (this.isProcessing)
+                {
+                    libbacktrack.Backtrack myWork = new libbacktrack.Backtrack(this.graphType, this.numVerMain, this.numVerDef, i,this.isFindEverything);
+                    myWork.Walk();
+                    if (this.isProcessing)
+                    {
+                        if (myWork.IsSemt)
+                        {
+                            txtResult.Dispatcher.BeginInvoke(new StringDelegate(printMessage), new object[] { 400, "" });
+                            txtResult.Dispatcher.BeginInvoke(new StringDelegate(printMessage), new object[] { 0, myWork.Result });
+                            if (!this.isFindEverything) { break; }
+                        }
+                        else { txtResult.Dispatcher.BeginInvoke(new StringDelegate(printMessage), new object[] { 401, i.ToString() }); }
+                    }
+                }
+            }
+        }
+    }
+}