![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка Bitmap двумя Thread [D7, WinXP]
Igor_K_A © (2007-06-07 05:21:00)Помогите решить проблему: есть Bitmap определенный в главном потоке программы и два дополнительных потока TThread, которые должны обрабатывать битмап парраллельно. Оброботка заключается в простом уменьшении разрешения - картинка бьется на ячейки, в каждой определяется доминирующий цвет и на сжатой картинке исходная картинка представляется уже одним пикселом. Замечен следующий баг: иногда выходная картинка закрашивается черным цветом на произвольную величину..а после этого выпадает "out of system resources". если использовать
MyThread1.Resume;
MyThread1.WaitFor;
MyThread2.Resume;
MyThread2.WaitFor;
вид запуска то все работает без ошибок и глюков, но теряется параллелизм :(
homm (2007-06-07 22:01:00) [21]> алгоритм обязательно оптимизирую и убиру медленные куски
Тебе не медленные куски убирать надо, а книжки читать и усиленно думать. Возьми для начала библиотеку какую, FastDib или какие еше там бывают. Это ДЛЯ НАЧАЛА. Был бы я на месте преподов, вообще бы оценку не ставил пока на ассемблере с использованием mmx бы не реализовал. Просто интересно, это все задание на диплом? Потому как это даже на 10-ю часть не тянет.
DVM (2007-06-07 21:53:00) [22]
> Eraser, вы гуру! Мой вам респект! Коротко и ясно!
Только вот толку от многопоточности не будет никакой ибо пока один поток залочил битмап, другой будет ждать.
Igor_K_A (2007-06-07 21:32:00) [23]Eraser, вы гуру! Мой вам респект! Коротко и ясно! Всем остальным тоже спасибо... алгоритм обязательно оптимизирую и убиру медленные куски
Eraser (2007-06-07 21:07:00) [24]> [0] Igor_K_A (07.06.07 05:21)
в многопоточном приложений при обращении к битмапу обязательно нужно использовать bmp.Canvas.Lock/Unlock иначе ошибки и глюки неминуемы.
oxffff (2007-06-07 20:50:00) [25]
> homm © (07.06.07 20:47) [32]
> > Ему пока нет.
>
> А говорил что при своем мнении останешься :)
Как тебе будет угодно. Но замечу мое мнение относилось к задаче, а не варианту решения этой задачи конкретным человеком.
homm (2007-06-07 20:47:00) [26]> Ему пока нет.
А говорил что при своем мнении останешься :)
oxffff (2007-06-07 20:39:00) [27]
> homm © (07.06.07 20:27) [30]
> > Я останусь при своем мнении, так же как и ты.
> > Думаю ты не можешь со мной не согласиться.
> > И это не потому что не я такой, а это инициатива Intel,
>
> > Amd, NVidia.
> > Многоядерность и все.
>
> При чем тут многоядерность? Код стмотрел? Ему что, второе
> ядро поможет? Забудь про коня в вакууме.
Ему пока нет. Но думаю до сдачи сделает. Во всяком случае надеюсь.
homm (2007-06-07 20:27:00) [28]> Я останусь при своем мнении, так же как и ты.
> Думаю ты не можешь со мной не согласиться.
> И это не потому что не я такой, а это инициатива Intel,
> Amd, NVidia.
> Многоядерность и все.
При чем тут многоядерность? Код стмотрел? Ему что, второе ядро поможет? Забудь про коня в вакууме.
oxffff (2007-06-07 20:24:00) [29]
> homm © (07.06.07 18:35) [26]
> Мама дорогая. А потом этот «дипломник» будет разрабатывать
> программы для видеонаблюдения в аэропортах, от которых в
> какой-то степени будет зависеть моя жизнь. Помоему справедливо
> бкдет помочь только в том случае, если он пообкщает пойти
> торговать сотовыми телефонами, и больше не прикасатся к
> компилятору.
>
> 2 oxffff
> Что я говорил? Как тебе код? Считаешь, все еше считаешь
> что то что здесь нужно — распаралелить на 2 ядра?
Я останусь при своем мнении, так же как и ты.
Думаю ты не можешь со мной не согласиться.
И это не потому что не я такой, а это инициатива Intel, Amd, NVidia.
Многоядерность и все.
Поэтому уже сейчас он нас требуют "решать шире вопросы", чтобы производительность хорошо масштабировалась с добавлением "вычислительных ядер", естественно не GUI приложения.
А для задач подобной этой.
Stream processing и все
Другой вопрос это конкретный вопрос автора темы.
Что он хочет неизвестно.
> MBo © (07.06.07 18:41) [27]
> крайне неразумно озадачиваться каким-то распараллеливанием,
> пока столько исключительно медленных операций даже в одной
> строке:
> VL.FindRow(ColorToString(Bit.Canvas.Pixels[i,j]),k))
>
> тем не менее: обращение к Canvas.Pixels не может производиться
> одновременно из нескольких потоков, нужна синхронизация.
>
MBo © (07.06.07 18:41) [27]
Lock buffer eму в помощь
Anatoly Podgoretsky (2007-06-07 19:42:00) [30]Что и следовало ожидать, тут не распаралеливать нужно, а веники вязать.
MBo (2007-06-07 18:41:00) [31]крайне неразумно озадачиваться каким-то распараллеливанием, пока столько исключительно медленных операций даже в одной строке:
VL.FindRow(ColorToString(Bit.Canvas.Pixels[i,j]),k))
тем не менее: обращение к Canvas.Pixels не может производиться одновременно из нескольких потоков, нужна синхронизация.
homm (2007-06-07 18:35:00) [32]Мама дорогая. А потом этот «дипломник» будет разрабатывать программы для видеонаблюдения в аэропортах, от которых в какой-то степени будет зависеть моя жизнь. Помоему справедливо бкдет помочь только в том случае, если он пообкщает пойти торговать сотовыми телефонами, и больше не прикасатся к компилятору.
2 oxffff
Что я говорил? Как тебе код? Считаешь, все еше считаешь что то что здесь нужно — распаралелить на 2 ядра?
Igor_K_A (2007-06-07 18:27:00) [33]procedure TMyThread.Execute;
begin
........
BitOut.Canvas.Pixels[i div st,j div st]:=GetColorSubMap(i,j,st);// BitOut Bitmap для хранения сжатой картинки, тоже определен в главном потоке программы
........
function TMyThread.GetColorSubMap(x,y,step: integer):TColor;
var
i,j,k: integer;
max: integer;
begin
dec(step);
max:=0;
for i:=x to x+step do
for j:=y to y+step do
begin
if not(VL.FindRow(ColorToString(Bit.Canvas.Pixels[i,j]),k)) then
VL.InsertRow(ColorToString(Bit.Canvas.Pixels[i,j]),'1',true)
else
VL.Cells[1,k]:=IntToStr(StrToInt(VL.Cells[1,k])+1);
end;
k:=0;
for i:=1 to VL.RowCount-1 do
begin
if StrToInt(VL.Cells[1,i])>max then begin max:=StrToInt(VL.Cells[1,i]); k:=i; end;
end;
Result:=StringToColor(VL.Cells[0,k]);
VL.Strings.Clear;
end;
end;
homm (2007-06-07 18:25:00) [34]> Разбивай по ширине, а не по высоте на 2 части.
Наоборот :)
homm (2007-06-07 18:24:00) [35]Разбивай по ширине, а не по высоте на 2 части. В том коде, который ты привел вообще не понятно на что ты разбиваешь.
MBo (2007-06-07 18:14:00) [36]ты до сих пор не сказал, как к битмапу обращаешься
Igor_K_A (2007-06-07 17:10:00) [37]MyThread1 := TMyThread.Create(true);
MyThread1.bp:=0; //начало интервала обработки
MyThread1.ep:=((Bit.Width div st) div 2)*st; //конец интервала обработки, st шаг сетки
MyThread1.Resume;
MyThread1.WaitFor; //////////
MyThread2 := TMyThread.Create(true);
MyThread2.bp:=((Bit.Width div st) div 2)*st+1;
MyThread2.ep:=Bit.Width;
MyThread2.Resume;
MyThread2.WaitFor; //////////
В таком виде работает все ок, но последовательно... если закоментировать строки помеченные ////////// тогда и начинаются все проблемы....причем даже если порождать один процесс то те же глюки
Сергей М. (2007-06-07 17:03:00) [38]
> Картинка бьется пополам
Показывай как "бьешь пополам" ...
Igor_K_A (2007-06-07 16:58:00) [39]Ядра действительно два. Картинка бьется пополам и каждая половинка обрабатывается независимо. т.е. нет информационных зависимостей. Картинка большая. Необходим именно параллелизм..т.к. это тема на диплом :)) "распараллеливание больших задач"
oxffff (2007-06-07 16:38:00) [40]
> tesseract © (07.06.07 16:34) [16]
>
> > Физически? Логически?
>
>
> Если два ядра, то они явно будут разбросаны по памяти процессов/ядер,
> т.е физически.
Это к чему?