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); } }
public void start() { BaseWorker th = new BaseWorker(runThreadsLoop); th.Name = "Main Thread Loop"; th.createThread(ref th); th.Start(); }
/// <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."); }