示例#1
0
文件: Threads.cs 项目: segmond/swicli
 /// <summary>
 /// FIX ME!!
 /// </summary>
 /// <param name="thread"></param>
 public static void RegisterThread12Many(Thread thread)
 {
     lock (ThreadRegLock)
     {
         IncrementUseCount(thread);
         lock (ThreadRegLock) unregisteredThreads.Remove(thread);
         PlMtEngine oldSelf;
         if (ThreadEngines.TryGetValue(thread.ManagedThreadId, out oldSelf))
         {
             oldSelf.PlSetEngine();
             return;
         }
         try
         {
             //var _iEngineNumber = libpl.PL_create_engine(IntPtr.Zero);
             oldSelf = new PlMtEngine();
             oldSelf.PlSetEngine();
             ThreadEngines.Add(thread.ManagedThreadId, oldSelf);
         }
         catch (Exception)
         {
             throw;
         }
     }
 }
        //[TestMethod]
        //[Ignore]
        public void Test_PlMtEngine_desroy_exception()
        {
            PlMtEngine mple1 = new PlMtEngine();
            PlQuery    q1    = null;

            mple1.PlSetEngine();
            q1 = new PlQuery("member(A, [a,b,c])");
            mple1.PlDetachEngine();
            mple1.Free();
            q1.Dispose();
        }
示例#3
0
文件: Threads.cs 项目: segmond/swicli
 /// <summary>
 /// FIX ME!!
 /// </summary>
 /// <param name="thread"></param>
 public static void RegisterThread12Many(Thread thread)
 {
     lock (ThreadRegLock)
     {
         IncrementUseCount(thread);
         lock (ThreadRegLock) unregisteredThreads.Remove(thread);
         PlMtEngine oldSelf;
         if (ThreadEngines.TryGetValue(thread.ManagedThreadId, out oldSelf))
         {
             oldSelf.PlSetEngine();
             return;
         }
         try
         {
             //var _iEngineNumber = libpl.PL_create_engine(IntPtr.Zero);
             oldSelf = new PlMtEngine();
             oldSelf.PlSetEngine();
             ThreadEngines.Add(thread.ManagedThreadId, oldSelf);
         }
         catch (Exception)
         {                    
             throw;
         }
     }
 }
        public void Test_Muliptle_engines()
        {
            // test case :

            // initialise
            // create thread and do
            // pl_create_engine
            // loop
            // pl_set_engine
            // do somthing in prolog
            // pl_detache_engine

            // create 2. thread and do
            // pl_create_engine
            // loop
            // pl_set_engine
            // do somthing in prolog
            // pl_detache_engine
            // pl_destroy_engine
            // create 3. thread and do
            // pl_create_engine
            // pl_set_engine
            // do somthing in prolog
            // pl_detache_engine
            // pl_destroy_engine

            // the first Thread
            PlMtEngine mple1 = new PlMtEngine();
            PlQuery    q1    = null;
            // the second Thread
            PlMtEngine mple2 = new PlMtEngine();
            PlQuery    q2    = null;

            string[] testResult = { "a", "b", "c" };

            mple1.PlSetEngine();
            q1 = new PlQuery("member(A, [a,b,c])");
            Assert.IsTrue(q1.NextSolution());
            Assert.AreEqual(testResult[0], q1.Args[0].ToString());
            Assert.IsTrue(q1.NextSolution());
            Assert.AreEqual(testResult[1], q1.Args[0].ToString());
            mple1.PlDetachEngine();

            mple2.PlSetEngine();
            q2 = new PlQuery("member(A, [a,b,c])");
            Assert.IsTrue(q2.NextSolution());
            Assert.AreEqual(testResult[0], q2.Args[0].ToString());
            mple2.PlDetachEngine();

            mple1.PlSetEngine();
            Assert.IsTrue(q1.NextSolution());
            Assert.AreEqual(testResult[2], q1.Args[0].ToString());
            q1.Dispose();
            mple1.PlDetachEngine();

            mple2.PlSetEngine();
            Assert.IsTrue(q2.NextSolution());
            Assert.AreEqual(testResult[1], q2.Args[0].ToString());
            //q2.Free();
            mple2.PlDetachEngine();

            //   mple1.Free();
            //   mple2.Free();
        }