示例#1
0
        protected async Task <List <Rectangle> > _findSubimagesMultithreaded(DirectBitmap small, byte margin, ImageSearchingOptions opts)
        {
            var xy    = MathHelper.CalculateTableForGrids(opts.Threads);
            var rects = this.Area.Split(xy.X, xy.Y).ToArray();
            var token = new cancelToken();
            DataflowNotifier <List <Rectangle> > df = null;
            AsyncManualResetEvent res = new AsyncManualResetEvent(false);

            if (opts.NumberOfResults > 0)   //limit search!
            {
                df = new DataflowNotifier <List <Rectangle> >(r => {
                    var @out = !(df.Collection.Count >= opts.NumberOfResults);
                    if (@out == false)   //has reached limit
                    {
                        token.Cancel();
                        res.Set();
                    }
                    return(@out);
                }, true);
            }
            else
            {
                df = new DataflowNotifier <List <Rectangle> >(true);
            }
            Debugging.Restart();
            //Debugging.Print("Ready to fire");
            int i = 0;

            Task[] tasks = opts.IgnoreAlphaPixels && small.Map != null
                ? rects.Select(r => Pool.Run(() => _findImageAlpha(small, r, small.Map.Ranges, margin, token, opts)).AndThen(t => df.Set(t))).ToArray()
                : rects.Select(r => Pool.Run(() => _findImage(small, r, margin, token, opts)).AndThen(t => df.Set(t))).ToArray();

            await Task.WhenAny(Task.WhenAll(tasks), res.WaitAsync());

            //Debugging.Print("Has Ended");
            return(df.Collection.ToArray().SelectMany(l => l).ToList());
        }