Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.07.2009, 19:45   #1
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
Вопрос Помогите подобрать оптимальное решение

В общем вот программка, пока не доделанная, основные моменты пишу, все исходники и текстовичок с описанием основного управления внутри. Подскажите как оптимизировать код, поскольку при добавлении большого числа объектов она явно лагает. Что-то нечего нормального кроме как использовать спидбатоны не приходит.
Вложения
Тип файла: zip Easy Sphere.zip (245.6 Кб, 22 просмотров)
Zeraim вне форума Ответить с цитированием
Старый 27.07.2009, 11:22   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может стоит всю отрисовку на чистом WIN API делать. Попробуй.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.07.2009, 15:05   #3
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Хм а может быть так, что мой массив подвисает ? Просто складывается ощущение что из него информация вытягиваеьтся не стразу а с какими-то задержками, или вообще не вытягивается =\\
===================================
Вот тут я проверяю находится ли мышка в площади иконки, может стоит использовать регионы для проверки ? Ни сама прога скомпиленая для наглядности проблемы 8)
Код:
windows.ClientToScreen(es.Handle,pC);
GetCursorPos(pW);
...
if (pW.X-pC.X in [x..x+32])and(pW.Y-pC.Y in [y..y+32])
      and(GetAsyncKeyState(vk_lbutton) < 0)and(es.Active = true) then begin
    pw.X := 0;//Исправление повторного открытия файла при активации формы
    pw.Y := 0;
    ShellExecute(Handle,'open',Pchar(mInfo[i].Path),nil,nil,SW_SHOWNORMAL);
    sleep(300);//Пока форма не станет не активной
  end;
Вложения
Тип файла: zip Project1.zip (216.4 Кб, 6 просмотров)

Последний раз редактировалось Zeraim; 27.07.2009 в 15:26.
Zeraim вне форума Ответить с цитированием
Старый 27.07.2009, 15:28   #4
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Чисто с изображением - уйдите от таймера. Таймер это медленно. Выводите в цикле (через Application.ProcessMessages) в буфер, а из него в таймере уже выводите в форму. На сколько тиков заведен таймер?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика

Последний раз редактировалось Utkin; 27.07.2009 в 15:31.
Utkin вне форума Ответить с цитированием
Старый 27.07.2009, 15:28   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ожет стоит использовать регионы для проверки
Думаю что не здесь проблема, а при отрисовке.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.07.2009, 15:36   #6
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Таймер установлен на 44 милисекунды или 24 кадра xD
Zeraim вне форума Ответить с цитированием
Старый 28.07.2009, 07:33   #7
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Как вариант - запускать приложение с большим приоритетом. И уменьшить число точек в окружности, по которой крутится иконка (ну тут нужен некий баланс - иначе иконка будет дергаться.).
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.07.2009, 12:42   #8
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

Она и так будет дёргатся, тут помоему не как не избавится, я ведь всяких фильтраций не использую xD А насчёт Application.ProcessMessages вы имели в виду создание бесконечных циклов ?
Zeraim вне форума Ответить с цитированием
Старый 28.07.2009, 13:11   #9
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Да бесконечный цикл. Ну почти бесконечный, с выходом посредством Break. Так Вы используйте фильтрацию.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 28.07.2009, 14:22   #10
Zeraim
Ra-Ra ?
Форумчанин
 
Аватар для Zeraim
 
Регистрация: 06.03.2008
Сообщений: 286
По умолчанию

В общем вроде работает, отрисовывает иконки, только вот лагает не по детски, 50% процессора кушает, и приложение отказывается закрыватся, + все ужасно дёргается.
Код:
var
  ES: TES;
  ugol : integer = 1;//Угол
  uInc : integer = 1;//Множитель угла
  R : integer = 20;//Радиус сферы 
  mR : integer;//Минимальный радиус
  mInfo : array of MyType;
  mX,mY : integer;
  Bmp : TBitmap;
  ExitIconDraw : boolean = false;
  StartedIconDraw : boolean = false;
...
procedure TES.IconDraw;
var
i,x,y: integer;
begin
while ExitIconDraw = false do begin
Bmp.Width := ES.Width;
Bmp.Height := ES.Height;
Bmp.Canvas.Brush.Color := clBlack;
Bmp.Canvas.Rectangle(0,0,Width,Height);
Bmp.Canvas.FillRect(Bmp.Canvas.ClipRect);
  for i := 0 to Length(mInfo)-1 do begin
    x := (es.Width div 2)-20+round(R*cos(i*2*pi/Length(mInfo)+GradToRad(ugol)));
    y := (es.Height div 2)-33+round(R*sin(i*2*pi/Length(mInfo)+GradToRad(ugol)));
    mInfo[i].X := x; mInfo[i].Y := y;
    Bmp.Canvas.Draw(x,y,mInfo[i].Icon);
  end;
  Application.ProcessMessages;
end;
end;
...
procedure TES.FormCreate(Sender: TObject);
begin
DoubleBuffered := true;
DragAcceptFiles(Handle, True);
Bmp := TBitmap.Create;
end;
...
procedure TES.FormDestroy(Sender: TObject);
begin
ExitIconDraw := true;
DragAcceptFiles(Handle, False);
SetLength(mInfo,0);
Bmp.Free;
end;
...
procedure TES.WMDropFiles(var M: TWMDropFiles);
var
nF : array[0..max_path] of char;
fInfo: TShFileInfo;
IT: DWORD;
ImageList: TImageList;
begin
...
if StartedIconDraw = false then IconDraw;
StartedIconDraw := true;
end;
...
procedure TES.Timer1Timer(Sender: TObject);
var
i,x,y: integer;
pC,pW : TPoint;
begin
...
ES.Canvas.FillRect(ES.Canvas.ClipRect);
ES.Canvas.Draw(0,0,Bmp);
inc(ugol,uInc);
end;
В общем похоже на то что я где то накосячил xD

Последний раз редактировалось Zeraim; 29.07.2009 в 13:42.
Zeraim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Помогите подобрать проц! myx Компьютерное железо 16 31.03.2010 21:29
Посоветуйте оптимальное решение Максим_Леонидович Общие вопросы Delphi 7 24.01.2009 12:12
Помогите подобрать ноут rim1233218 Компьютерное железо 20 12.11.2008 15:12
помогите подобрать тему для диплома serbezoff Помощь студентам 9 08.10.2007 21:49