Есть готовая программа на C#, которая отлично делает с пару десятков разных вычислений, допустим Фибоначчи, Хибоначчи, Цибоначчи...
На форме есть кнопки, которые так и называются: Фибоначчи, Хибоначчи...
При нажатии на кнопку, запускается соответствующий просчет и результаты каждые 1/5 сек выводятся на форму, при нажатии на другую кнопку расчет прерывается и начинают выводиться результаты другой функции. Каждая из функций использует многопоточность и всё это вместе работает шикарно...на 4-ядерном процессоре. Стоит уменьшить количество доступных ядер до 1-2, программа начинает жестко тупить.
Реализация:
кнопка на форме вызывает backgroundWorker, который подготавливает данные и запускает одну из многопоточных функций
//многопоточная функция
double rezultat;//постоянно изменяется в функции fun, а каждые 1/5 сек отсюда выводится на форму
void fun(BackgroundWorker worker){}
void fibonacci(BackgroundWorker worker)
{
...
threads=48;
funcDelegate deleg = new funcDelegate (func);
IAsyncResult[] results2 = new IAsyncResult[threads];
for (int i = 0; i < threads; i++)//цикл перебора всех комбинаций
results2[i] = deleg .BeginInvoke(worker);
for (int i = 0; i < threads; i++)//получение результатов
d.EndInvoke(results2[i]);
}
1. Если убрать многопоточность, то все работает шикарно на любом количестве ядер.
2. Если запускать вычисление не в фоне, а результат получать по завершении работы функции то всё так же работает шикарно.
3. Если добавить кнопку "СТОП" и прерывать предыдущее вычисление кнопкой, а потом начинать следующее, то так же всё работает.
4. Если на компьютере 4 ядра, то тоже все прекрасно.
Уже всё перечитал, и про пулы потоков тоже, всё испытал, до чего мозгов хватило.
Посоветуйте, как правильно реализовать.