![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Я через цикл меняю каждый пиксель в битмапе размером 3000х3000,
это длиться секунд 40 , на это время приложение не реагирует на нажатия мышкой по кнопочкам и тд, как избавиться от этого зависания, чтобы можно было нажать хотя-бы кнопку отмена. |
|
#2
|
|||
|
|||
|
Код:
Application.ProcessMessages; |
|
#3
|
||||
|
||||
|
На выполнение 9000000 циклов 40 сек? Скорее алгоритм поправить надо, а использование Application.ProcessMessages, хоть и отдаст управление, зато процесс еще более замедлит.
|
|
#4
|
||||
|
||||
|
Вот например два алгоритма делающие одно и то-же, но второй работает в 4 раза быстрее.
Код:
Var
x,y: Integer;
TickCount: DWord;
begin
TickCount := GetTickCount;
for x := 1 to Form30.Width
do for y := 1 to Form30.Height
do Form30.Canvas.Pixels[x,y] := Rgb(Random(255),Random(255),Random(255));
ShowMessage(IntToStr(GetTickCount - TickCount));
end;Код:
Var
x,y: Integer;
Bitmap: TBitmap;
TickCount: DWord;
begin
TickCount := GetTickCount;
Bitmap := TBitmap.Create;
Bitmap.Width := Form30.Width;
Bitmap.Height := Form30.Height;
for x := 1 to Form30.Width
do for y := 1 to Form30.Height
do Bitmap.Canvas.Pixels[x,y] := Rgb(Random(255),Random(255),Random(255));
Form30.Canvas.Draw(0,0,Bitmap);
ShowMessage(IntToStr(GetTickCount - TickCount));
end; |
|
#5
|
|||
|
|||
|
Цитата:
это самое то что мне нужно. Цитата:
насчет скорости, я теперь использую bitmap.scanline, работает намного быстрее чем bitmap.canvas.pixels |