![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Доброго всем дня! Смиренно надеюсь на вашу помощь в попытке разобраться в проблеме. Через GDI+ потоками перебираю массив изображений (тысячи), в данном кусочке кода меняю размер. im8bpp, im:TGPBitmap; mpict[j].Loct - массив в котором хранятся данные о изображениях (Loct-путь). Перебор индекса масива - через глобальную переменную (каждый поток хапнул свой индекс и инкрементнул его для следующей итерации, через критическую секцию). kvcnt - содержит новый размер и не меняется при запущенном потоке.
Код:
im := TGPBitmap.Create(mpict[j].Loct); im8bpp:=TGPBitmap.Create(kvcnt,kvcnt,PixelFormat32bppARGB); gp:=TGPGraphics.Create(im8bpp); // gp.SetSmoothingMode(SmoothingModeHighSpeed); // gp.SetInterpolationMode(InterpolationModeLowQuality); //это была попытка убрать красивости в угоду скорости - эффект - 0. gp.DrawImage(im,0,0,kvcnt,kvcnt); gp.Free; im.Free; //дальнейшая обработка im8bpp, ее отключал она на производительность не влияет Вопрос: Почему работает все равно в один поток. Я что один поток запускаю что 2 - время выполнения не меняется. В этой же программе аналогичным способом через потоки организована обработка масивов - там нагрузка логичным образом стремится занять весь проц и стремится к 100%, здесь же располагается на одном ядре до 50%. В потоках никакие визуальные компоненты не трогаю (все прогресбары и текстовое сопровождение реализованы через поток главной формы //их тоже отключал, на нагрузке и времени выполнения никак не сказываются). Пришел к выводу что это этот кусочек кода. Помогите разобраться, что не так. PS: возможно логичнее было начинать не в теме про графику, а в теме про потоки, но поскольку темы про потоки не нашел, а работаю с графикой - разместил здесь. Прошу не пинать Ну и вдогонку еще вопрос: команда im:=im8bpp; не приводит к ошибке, картинка через переменную im в дальнейшем корректно (насколько могу судить) обрабатывается, но попытка сделать im8bpp.Free; - приводит к ошибке, а я ж ее освободил, или нет? и если при таком раскладе im является указателем на im8bpp, то как их корректно "размножить", ну типа а:=2; b:=a; далее в b имеем значение 2, а с а делаем дальше что хотим. Надо вот также но с картинкой TGPBitmap как сделать? Последний раз редактировалось Admin, 29.03.2012 в 13:47. |