Beispiel #1
0
        void DoFor(int iterations, ParallelAction action, Task task)
        {
            if (!m_Initialized)
                Initialize();

            // No multithreaded support
            if (!m_Initialized)
            {
                for (var i = 0; i < iterations; ++i)
                    action(i);

                return;
            }

            if (iterations == 0)
                return;

            var chunkSize = Mathf.Clamp(iterations/m_ThreadCount, 1, iterations);
            task.ResetTask(iterations, chunkSize, action);
            
            var id = 0;

            for (var i = 0; i < iterations; i += chunkSize)
            {
                var startIndex = id*chunkSize;
                var endIndex = Math.Min(startIndex + chunkSize, iterations);

                m_ActionQueue.Enqueue(() => DoTaskAction(task, startIndex, endIndex));
                m_QueueIsNotEmptyEvent.Set();

                ++id;
            }

            task.Wait();
        }