Вот модификация категории, написанной iWasRobbed выше. Он сохраняет пропорции исходного изображения, а не искажает его.
- (UIImage*)scaleToSizeKeepAspect:(CGSize)size {
UIGraphicsBeginImageContext(size);
CGFloat ws = size.width/self.size.width;
CGFloat hs = size.height/self.size.height;
if (ws > hs) {
ws = hs/ws;
hs = 1.0;
} else {
hs = ws/hs;
ws = 1.0;
}
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0.0, size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextDrawImage(context, CGRectMake(size.width/2-(size.width*ws)/2,
size.height/2-(size.height*hs)/2, size.width*ws,
size.height*hs), self.CGImage);
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return scaledImage;
}
Очередь без блокировок из OmniThreadLibrary поддерживает несколько производителей. Вы можете использовать его отдельно от библиотеки потоков (т.е. вы можете использовать модуль OtlContainers в любой другой структуре).
Как Даниэле указал ниже, в OmniThreadLibrary есть две очереди. Один в OtlContainers поддерживает нескольких производителей и нескольких потребителей, в то время как «умная» версия в OtlComm (которая является просто оболочкой для более простой версии) - только один производитель / один потребитель.
Документация по-прежнему является большой проблемой для библиотеки OmniThreadLibrary. project :(. Некоторую информацию об очереди можно найти здесь .
Может быть, это может быть полезно: Связанные функции SList .
http://svn.berlios.de/svnroot/repos/dzchart/utilities/dzLib/trunk/lockfree/
@Daniele Teti:
Читатель должен дождаться всех писатели, у которых все еще есть доступ к старой очереди для выхода из метода Enqueue. Поскольку первое, что делает читатель в методе Dequeue, - это создает новую очередь для новых писателей, которые входят в очередь, всем модулям записи, имеющим ссылку на старую очередь, не требуется много времени, чтобы выйти из очереди. Но вы правы: он свободен от блокировок только для писателей, но может по-прежнему требовать, чтобы поток чтения ждал, пока некоторые писатели выйдут из очереди.
Для очереди / FIFO с несколькими производителями / одним потребителем вы можете легко сделать одну LockFree с помощью SLIST или тривиального стека Lock Free LIFO. У вас есть второй «частный» стек для потребителя (который также может быть реализован в виде SLIST для простоты или любой другой модели стека по вашему выбору). Потребитель извлекает элементы из частного стека. Всякий раз, когда частный LIFO исчерпывается, вы выполняете Flush, а не Pop из совместно используемого параллельного SLIST (захват всей цепочки SLIST), а затем просматриваете очищенный список по порядку, помещая элементы в частный стек.
Это работает для одиночных операций. производитель / один потребитель и для нескольких производителей / одного потребителя.
Однако он не работает для случаев, когда несколько производителей / несколько потребителей.