예제 #1
0
 protected void setActiveThreads()
 {
     while (m_Run)
     {
         DateTime start = DateTime.Now;
         if ((m_ActiveThreads.Count() < m_MaxThreads) && (m_ThreadQueue.Count > 0)
             )
         {
             lock (m_Lock)
             {
                 start = DateTime.Now;
                 while (m_ActiveThreads.Count() < m_MaxThreads &&
                        m_ThreadQueue.Count() > 0 &&
                        DateTime.Now - start < TimeSpan.FromSeconds(2))
                 {
                     //pop a thread and start, and increment active threads
                     BaseWorker popThread = m_ThreadQueue[0];
                     m_ThreadQueue.RemoveAt(0);
                     if (popThread != null &&
                         !m_ActiveThreads.ContainsKey(popThread.ThreadId.ToString()))
                     {
                         m_ActiveThreads[popThread.ThreadId.ToString()] = popThread;
                         if (popThread.ThreadState == System.Threading.ThreadState.Unstarted)
                         {
                             popThread.Start();
                         }
                     }
                 }
             }
         }
         Thread.Sleep(120);
     }
 }
예제 #2
0
        public void start()
        {
            BaseWorker th = new BaseWorker(runThreadsLoop);

            th.Name = "Main Thread Loop";
            th.createThread(ref th);
            th.Start();
        }
예제 #3
0
        /// <summary>
        /// This function serves as the master run thread loop.
        /// </summary>
        public void runThreadsLoop()
        {
            DateTime   printStatusTime = DateTime.Now;
            int        count           = 0;
            BaseWorker cancelTh        = new BaseWorker(this.setCancelledThreads);

            cancelTh.Name = "setCancelledThreads";
            cancelTh.createThread(ref cancelTh);
            cancelTh.Start();
            BaseWorker activeTh = new BaseWorker(this.setActiveThreads);

            activeTh.Name = "setActiveThreads";
            activeTh.createThread(ref activeTh);
            activeTh.Start();
            BaseWorker maxTh = new BaseWorker(this.setMaxThreads);

            maxTh.Name = "setMaxThreads";
            maxTh.createThread(ref maxTh);
            maxTh.Start();
            BaseWorker gcTh = new BaseWorker(this.gcCleanup);

            gcTh.Name = "gcCleanup";
            gcTh.createThread(ref gcTh);
            gcTh.Start();

            // maybe create 3 threads to manage the arrays.
            while (m_Run)
            {
                DateTime start            = DateTime.Now;
                int      completedThreads = 0;

                if (DateTime.Now - printStatusTime > TimeSpan.FromSeconds(5) &&
                    (m_DeadThreads.Count > 0 || m_ActiveThreads.Count > 0))
                {
                    start = DateTime.Now;
                    for (int i = 0;
                         i < m_DeadThreads.Count &&
                         DateTime.Now - start < TimeSpan.FromSeconds(2);
                         i++)
                    {
                        if (m_DeadThreads[i] == null ||
                            m_DeadThreads[i].Join(150))
                        {
                            //m_DeadThreads[i] = null;
                            m_DeadThreads.RemoveAt(i);
                            //Console.Write(".");
                            i--;
                            completedThreads++;
                        }
                    }
#if DEBUG
                    Console.WriteLine(m_InstanceName + "\n" +
                                      "Added Threads: " + m_TotalThreads +
                                      "\nQueued Threads: " + m_ThreadQueue.Count +
                                      "\nActive Threads: " + m_ActiveThreads.Count +
                                      "\nCompleted Threads: " + completedThreads +
                                      "\nDead Threads: " + m_DeadThreads.Count +
                                      "\nMax Threads: " + m_MaxThreads +
                                      "\nRequested Threads: " + MaxThreads);
                    m_TotalThreads   = 0; // added threads
                    completedThreads = 0;
#endif
                    printStatusTime = DateTime.Now;
                }
                else
                {
                    if (m_ActiveThreads.Count > m_MaxThreads)
                    {
                        Thread.Sleep(120);
                    }
                    //else
                    //    Thread.Sleep(300);
                }
                Thread.Sleep(120);
            }

            //update history to complete
            Console.WriteLine("All threads complete, press any key to continue.");
        }