Esempio n. 1
0
        public void FireAllThreads(object o)
        {
            if (!(o is ProgramExecutionStartegyParams))
            {
                return;
            }

            ProgramExecutionStartegyParams param = o as ProgramExecutionStartegyParams;
            int offsetStart = param.ExecutionOffsetStart;
            int offsetStop  = param.ExecutionOffsetStop;

            int[]  imageBytes  = param.ImageBytes;
            int    imageWidth  = param.ImageWidth;
            int    imageHeight = param.ImageHeight;
            double RangeXStart = param.RangeXStart;
            double RangeXStop  = param.RangeXStop;
            double RangeYStart = param.RangeYStart;
            double RangeYStop  = param.RangeYStop;
            double CRe         = param.ParamCRe;
            double CIm         = param.ParamCIm;
            bool   debugMode   = param.debugMode;

            param.Strategy.execute(ref imageBytes, offsetStart, offsetStop, imageWidth, imageHeight, RangeXStart, RangeXStop, RangeYStart, RangeYStop, CRe, CIm, debugMode);
        }
Esempio n. 2
0
        public void bw_DoWork(object sender, DoWorkEventArgs e)
        {
            IProgramExecutionStrategy strategy = ProgramExecutionStrategyFactory.getStrategy(this.form.ExecutionMode);
            int coresCount = this.form.ParamCores;

            this.form.setExecution(true);

            Thread[] threadPool = new Thread[coresCount];
            ProgramExecutionStartegyParams[] threadParamsStack = new ProgramExecutionStartegyParams[coresCount];

            double RangeXStart      = this.form.RangeXStart;
            double RangeXStop       = this.form.RangeXStop;
            double RangeYStart      = this.form.RangeYStart;
            double RangeYStop       = this.form.RangeYStop;
            double CRe              = this.form.ParamCRe;
            double CIm              = this.form.ParamCIm;
            bool   debugModeEnabled = this.form.DebugMode;

            imageBytes = new int[imageWidth * imageHeight];

            for (int i = 0; i < imageBytes.Length; ++i)
            {
                imageBytes[i] = 0;
            }

            int ExecutionStepsStop       = imageHeight;
            int ExecutionStepsPerProcess = (int)Math.Ceiling((double)ExecutionStepsStop / threadPool.Length);
            int ExecutionStepsTotal      = 0;

            for (int i = 0; i < threadPool.Length; ++i)
            {
                threadParamsStack[i]          = new ProgramExecutionStartegyParams();
                threadParamsStack[i].ThradId  = i + 1;
                threadParamsStack[i].Strategy = ProgramExecutionStrategyFactory.getStrategy(this.form.ExecutionMode);

                ExecutionStepsTotal += ExecutionStepsPerProcess;

                threadParamsStack[i].ExecutionOffsetStart = i * ExecutionStepsPerProcess;

                if (threadParamsStack[i].ThradId == threadPool.Length)
                {
                    threadParamsStack[i].ExecutionOffsetStop = ExecutionStepsStop;
                }
                else
                {
                    threadParamsStack[i].ExecutionOffsetStop = ExecutionStepsTotal;
                }

                threadParamsStack[i].ImageBytes  = new int[imageWidth * imageHeight];
                threadParamsStack[i].ImageWidth  = imageWidth;
                threadParamsStack[i].ImageHeight = imageHeight;
                threadParamsStack[i].RangeXStart = RangeXStart;
                threadParamsStack[i].RangeXStop  = RangeXStop;
                threadParamsStack[i].RangeYStart = RangeYStart;
                threadParamsStack[i].RangeYStop  = RangeYStop;
                threadParamsStack[i].ParamCRe    = CRe;
                threadParamsStack[i].ParamCIm    = CIm;
                threadParamsStack[i].debugMode   = debugModeEnabled;

                threadPool[i] = new Thread(new ParameterizedThreadStart(FireAllThreads));
            }

            for (int i = 0; i < threadPool.Length; ++i)
            {
                threadPool[i].Start(threadParamsStack[i]);
            }

            stopwatch.Restart();

            for (int i = 0; i < threadPool.Length; ++i)
            {
                threadPool[i].Join();
            }

            stopwatch.Stop();

            // merge data from threads
            for (int i = 0; i < threadPool.Length; ++i)
            {
                for (int n = threadParamsStack[i].ExecutionOffsetStart * threadParamsStack[i].ImageHeight; n < threadParamsStack[i].ExecutionOffsetStop * threadParamsStack[i].ImageHeight; ++n)
                {
                    imageBytes[n] = threadParamsStack[i].ImageBytes[n];
                }
            }
        }