a more useful sample :
//Pipeline are magic <3
var bufferRandom = new BlockingCollection<double>(4096);
var bufferComplex = new BlockingCollection<Complex>(4096);
var bufferFiltered = new BlockingCollection<Complex>(4096);
var bufferFiltered2 = new BlockingCollection<Complex>(4096);
var bufferBmp = new BlockingCollection<Tuple<int, int>>(4096);
var f = new TaskFactory(TaskCreationOptions.LongRunning, TaskContinuationOptions.None);
var stage1 = f.StartNew(() => Buddhapipeline.RandomGenerator(bufferRandom, 32));
var stage2 = f.StartNew(() => Buddhapipeline.ComplexGenerator(bufferRandom, bufferComplex, -2, 1.0, -1.5, 1.5));
var stage3 = f.StartNew(() => Buddhapipeline.quickRejectionFilter(bufferComplex, bufferFiltered));
var stage4 = f.StartNew(() => Buddhapipeline.iterativeRejectionFilter(bufferFiltered, bufferFiltered2));
var stage5 = f.StartNew(() => Buddhapipeline.complexToBmp(bufferFiltered2, bufferBmp, -2, 1.0, -1.5, 1.5, imageWidth, imageHeight));
var stage6 = f.StartNew(() => Buddhapipeline.pointToScreen(bufferBmp, pBackBuffer));
And 2 sample consumer/producer :
/*
* quick rejection filter
*/
public static void quickRejectionFilter(BlockingCollection<Complex> input, BlockingCollection<Complex> output)
{
foreach(var item in input.GetConsumingEnumerable())
{
if (Complex.Abs(item) > 2.0) continue;
if (((Complex.Abs(item - new Complex(-1, 0))) < 0.25)) continue;
if ((Complex.Abs(1.0 - Complex.Sqrt(Complex.One - (4 * item))) < 1.0)) continue; //may be wrong
if ((((item.Real + 1.309) * (item.Real + 1.309)) + item.Imaginary * item.Imaginary) < 0.00345) continue;
if ((((item.Real + 0.125) * (item.Real + 0.125)) + (item.Imaginary - 0.744) * (item.Imaginary - 0.744)) < 0.0088) continue;
if ((((item.Real + 0.125) * (item.Real + 0.125)) + (item.Imaginary + 0.744) * (item.Imaginary + 0.744)) < 0.0088) continue;
//We tried every known quick filter and didn't reject the item, adding it to next queue.
output.Add(item);
}
}
/* iterative rejection filter */
public static void iterativeRejectionFilter(BlockingCollection<Complex> input, BlockingCollection<Complex> output)
{
foreach (var item in input.GetConsumingEnumerable())
{
int iter = 0;
Complex z = Complex.Zero;
while ((Complex.Abs(z) < 4.0) && (iter < 2000))
{
iter++;
z = z * z + item;
}
if (iter == 2000) continue;
//We tried, couldn't reject it, adding it to next queue
output.Add(item);
}
}