Вверх ↑
Ответов: 964
Рейтинг: 12
#1: 2016-10-01 12:20:24 ЛС | профиль | цитата
Кстати, многие элементы Хайасм используют многоядерность в явном виде.
Посмотрите на код (Ctr-f) разных графических фильтров вроде сглаживания (BLUR) изображений.
procedure THIPBlur.Simple;
var rc:PThreadRec;
i,c:integer;
id:LongWord;
lpSystemInfo:_SYSTEM_INFO;
FEvents:array of cardinal;
lst:PList;
begin
bmp.PixelFormat := pf24bit;
src.PixelFormat := pf24bit;
if(bmp.Width > 256)and(bmp.Height > 256)then
begin
GetSystemInfo(lpSystemInfo);
c := lpSystemInfo.dwNumberOfProcessors;
//!! Выясняет количество доступных ядер/cpu
end
else c := 1;

lst := NewList;
SetLength(FEvents, c);
for i := 1 to c do
begin
new(rc);
rc.src := src;
rc.bmp := bmp;
rc.size := bmp.height div c;
rc.Start := (i-1)*rc.size;
rc.handle := CreateThread(0, 0, @Simple_proc, rc, 0, id);
//..и раскидывает задачу по потокам количество которых равно количеству ядер
FEvents[i-1] := rc.handle;
lst.Add(rc);
SetThreadPriority(rc.handle, THREAD_PRIORITY_HIGHEST);
end;
WaitForMultipleObjects(c, PWOHandleArray(@FEvents[0]), true, cardinal(-1));
for i := 0 to c-1 do
begin
CloseHandle(FEvents[i]);
dispose(PThreadRec(lst.Items[i]));
end;
lst.Free;
end;

карма: 0

0
Редактировалось 2 раз(а), последний 2016-10-01 12:29:00