private void StartTeachingThreads() { int threadCount = Math.Min(imagesToTeach.Count, 2 * Environment.ProcessorCount); int threadPart = imagesToTeach.Count / threadCount; var barrier = new Barrier(threadCount, item => isTeaching = false); var threadParameters = new TeachThreadParameter[threadCount]; for (int i = 0; i < threadCount; ++i) { threadParameters[i] = new TeachThreadParameter( threadPart * i, ((i + 1) < threadCount) ? (threadPart * (i + 1)) : (imagesToTeach.Count), barrier); ThreadPool.QueueUserWorkItem(new WaitCallback(TeachThread), threadParameters[i]); } }
private void TeachThread(object parameter) { TeachThreadParameter input = parameter as TeachThreadParameter; if (input == null) { throw new ArgumentNullException("Неправильный параметр потока."); } var delta = 1.0 / filesToTeach.Count; for (int i = input.From; (i < input.To) && (!isTeachingAborted); ++i) { try { var image = new SimpleImage(imagesToTeach[i]); var imageData = image.GetGrayData(); var lbp = new LBPCreator(imageData, true, true, false); var glcm = new GLCMCreator(imageData, true, true, false); AddFeatures(glcm.Feature, lbp.Feature, filesToTeach[i]); } catch (Exception ex) { MessageBox.Show(ex.Message); continue; } finally { lock ((knownFiles as ICollection).SyncRoot) { teachProgress += delta; } } } input.CommonBarrier.SignalAndWait(); }
private void StartTeachingThreads() { int threadCount = Math.Min(imagesToTeach.Count, 2 * Environment.ProcessorCount); int threadPart = imagesToTeach.Count / threadCount; var barrier = new Barrier(threadCount, item => isTeaching = false); var threadParameters = new TeachThreadParameter[threadCount]; for (int i = 0; i < threadCount; ++i) { threadParameters[i] = new TeachThreadParameter( threadPart * i, ((i + 1) < threadCount) ? (threadPart * (i + 1)) : (imagesToTeach.Count), barrier); ThreadPool.QueueUserWorkItem(new WaitCallback(TeachThread), threadParameters[i]); } }