Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка Bitmap двумя Thread [D7, WinXP]


Страницы:   1 2 3

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]
>
> > Физически? Логически?
>
>
> Если два ядра, то они явно будут разбросаны по памяти процессов/ядер,
>  т.е физически.


Это к чему?


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо