Одно из моих любимых решений этой проблемы подобно producer/consumer
шаблон.
я создаю основной поток (в значительной степени моя программа Main()
), который содержит блокирующийся объект очереди.
Этот основной поток отделяет несколько рабочих потоков, какие простые поп-вещи от центрального блокирования распараллеливают и обрабатывают их. Так как это - ориентированная на многопотоковое исполнение очередь блокирования, биты синхронизации легки - эти TaskQueue.Dequeue()
, вызов заблокируется, пока задача не ставится в очередь потоком производителя / основным потоком.
можно динамично управлять числом рабочих, Вы хотите или фиксируете его согласно переменной конфигурации - так как они все просто выталкивают вещи от очереди, число рабочих не добавляет сложности.
В моем случае, у меня есть сервис, который обрабатывает несколько различных типов tasks
. Мне ввели очередь для обработки чего-то универсального как TaskQueueTask
. Тогда я разделяю это на подклассы и переопределяю Execute()
метод.
я также попробовал подход пула потоков.NET, где в Вас может бросить вещи в пул очень легко. Это чрезвычайно было просто в использовании, но также и обеспечило мало управления и никакую гарантию порядка выполнения, синхронизации, и т.д. Это рекомендовало только для легких задач.
HBITMAP bmp;
CImage image;
image.Attach(bmp);
image.Save("filename.jpg"); // change extension to save to png
определение min и max следующим образом:
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
и их размещение ДО включения gdi plus сработало для меня :)