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

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

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.02.2009, 11:53   #1
Ja`
Пользователь
 
Аватар для Ja`
 
Регистрация: 12.02.2009
Сообщений: 11
По умолчанию Бесконечный график на TImage, требуется помощь в оптимизации!

Доброго времени суток

Помогите, пожалуйста, с оптимизацией рисования "графика" на канвасе, тут проблемка вот в чем: дело в том, что данные читаются из файла, на движении мыши происходит смещение указателя в файле на определенную строку, так вот при работе с объемными файлами начинаются тормаза, собственно вот код:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    Image3: TImage;
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure FormCreate(Sender: TObject);

  private
    { Private declarations }
    buf: array[0..99] of char;
    f :thandle;
    dwRead: DWORD;
  public
    { Public declarations }
    vFile: TextFile;
    x, yspeed, ydenc, yconc, vPos, dX, sX: integer;
    str, speed, denc, conc, vPref: string;
    MoveFlag: boolean;
    xPos, yPos: integer;
    Rect: TRect;

  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
begin
sX:=0;
MoveFlag:=false;
      f:=fileopen('temp.log',fmOpenReadWrite);
      x:=0;
      yspeed:=Image1.Height;
      ydenc:=Image2.Height;
      yconc:=Image3.Height;
      Image1.Canvas.Pen.Color:=clRed;
      Image1.Canvas.MoveTo(x,yspeed);
      Image2.Canvas.MoveTo(x,ydenc);
      Image3.Canvas.MoveTo(x,yconc);
      for i:=0 to Image1.Width do begin
        Inc(x);
        ReadFile(f, Buf, 31, dwRead, nil);
        str:=buf;
        vPos:=Pos(' ', str);
        vPref:=Copy(str, vPos+1, Length(str));
        str:=vPref;
        vPos:=Pos(' ', str);
        speed:=Copy(str, 0, vPos-1);
        yspeed:=Image1.Height-(Trunc(StrToFloat(speed))*8);
        if yspeed<0 then yspeed:=0;
        Image1.Canvas.LineTo(x,yspeed);
      end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  moveFlag:=true;
  Screen.Cursor:=crSizeWE;
  xPos:=X;
  yPos:=Y;
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  moveFlag:=false;
  Screen.Cursor:=crDefault;
  sX:=dX;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var i:integer;
begin
  if moveFlag then begin
  Sleep(0);
  dX:=(xPos-X)+sX;
  if  dX < 0 then
    begin
    xPos:=X;
    dX:=0;
    exit;
  end;
  Rect:=Image1.ClientRect;  Image1.Canvas.FillRect(Rect);
      SetFilePointer(f, dX*31, nil, FILE_BEGIN);
      y:=Image1.Height;
      x:=0;
      for i:=0 to Image1.Width do begin
        Image1.Canvas.MoveTo(x,yspeed);
        Inc(x);
        ReadFile(f, Buf, 31, dwRead, nil);
        str:=buf;
        vPos:=Pos(' ', str);
        vPref:=Copy(str, vPos+1, Length(str));
        str:=vPref;
        vPos:=Pos(' ', str);
        speed:=Copy(str, 0, vPos-1);
        yspeed:=Image1.Height-(Trunc(StrToFloat(speed))*8);
        if yspeed<0 then yspeed:=0;
        Image1.Canvas.LineTo(x,yspeed);
      end;
  end;
end;

end.
часть файлика temp.log:

00 0006,2562 50 0050,04958678
00 0000,0005 66 0000,00873414
00 0072,0951 75 0000,01310111
00 0252,3314 80 0000,01746811
00 0216,2877 83 0000,02183508
00 0000,0414 85 0000,02586100
00 0151,3988 87 0000,03017106
00 0252,3363 88 0000,03448114
00 0216,2841 90 0000,03879118
00 0216,2841 90 0000,04310121
00 0189,2513 91 0000,04741119
00 0034,4091 92 0000,05172049
00 0012,2097 92 0000,05602806
00 0302,7977 93 0000,06033781
01 000000000 06 0000,00026011
01 0012,2097 11 0000,00052022
01 0012,3089 16 0000,00078033
01 0012,2097 21 0000,00104043
01 0012,3089 25 0000,00130054
01 0012,5124 28 0000,00156064
...

все строки имеют один и тот же формат...исходники прилагаются
Вложения
Тип файла: rar paint.rar (381.1 Кб, 14 просмотров)
Ja` вне форума Ответить с цитированием
Старый 12.02.2009, 12:00   #2
Ja`
Пользователь
 
Аватар для Ja`
 
Регистрация: 12.02.2009
Сообщений: 11
По умолчанию

кстати вариант с Thread`ом можете не предлагать, он был рассмотрен и реализован, но не подходит для решения этого типа задачи. Может кто-нибудь подскажет более рациональный способ, чем этот?
Ja` вне форума Ответить с цитированием
Старый 12.02.2009, 12:01   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Мож не в тему, но почему б это не поручить TChart'у?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.02.2009, 12:11   #4
Ja`
Пользователь
 
Аватар для Ja`
 
Регистрация: 12.02.2009
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Мож не в тему, но почему б это не поручить TChart'у?
а с этого места можно по подробнее?...вот допустим я буду использовать TChart, какие преимущества я буду иметь?
Ja` вне форума Ответить с цитированием
Старый 12.02.2009, 12:19   #5
lexaltd
Форумчанин
 
Регистрация: 21.07.2008
Сообщений: 192
По умолчанию

C:\Program Files\Borland\Delphi7\Demos\TeeChar t
Посмотри тут , там есть пример - всё что может Chart
lexaltd вне форума Ответить с цитированием
Старый 12.02.2009, 22:44   #6
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Насколько большие будут файлы? Почему бы не грузить их в память? Будет намного быстрее, но зато в начале придется немного подождать. 1мб это вовсе не большой. Даже если 10 мб, если программа нужная, то это не много.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 13.02.2009, 15:51   #7
Ja`
Пользователь
 
Аватар для Ja`
 
Регистрация: 12.02.2009
Сообщений: 11
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Насколько большие будут файлы? Почему бы не грузить их в память? Будет намного быстрее, но зато в начале придется немного подождать. 1мб это вовсе не большой. Даже если 10 мб, если программа нужная, то это не много.
Вообще задача состоит вот в чем: в TThread`e происходит вычисление данных и паралельно рисуется график по этим данным + данные записываются в файл. При нажатии клавишы мыши и ее движения вправо, отрисовка графика из трида прекращается и график начинает отрисовываться из файла(для просмотра того, что было нарисовано ранее), в этот момент трид скидывает данные в другой файл. Потом, допустим, по нажатии TButton файлы склеиваются в 1 файл и отрисовка графика опять идет с TThread`a. Поэтому не о каких задержках не может быть и речи, файлы могут достигать ну ооочень больших размеров
mutabor и на всякий случай подскажи как загрузить файл в ОЗУ
Ja` вне форума Ответить с цитированием
Старый 13.02.2009, 15:55   #8
Ja`
Пользователь
 
Аватар для Ja`
 
Регистрация: 12.02.2009
Сообщений: 11
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Мож не в тему, но почему б это не поручить TChart'у?
Цитата:
Сообщение от lexaltd Посмотреть сообщение
C:\Program Files\Borland\Delphi7\Demos\TeeChar t
Посмотри тут , там есть пример - всё что может Chart
Кстати спасибо, с ним действительно чуть по шустрее стало работать
Ja` вне форума Ответить с цитированием
Старый 13.02.2009, 18:04   #9
mutabor
Телепат с дипломом
Старожил
 
Аватар для mutabor
 
Регистрация: 10.06.2007
Сообщений: 4,929
По умолчанию

Цитата:
mutabor и на всякий случай подскажи как загрузить файл в ОЗУ
Можно просто в TStrings его погрузить методом LoadFromFile. А можно так: TFileStream ---> TMemoryStream, и он в памяти.
The future is not a tablet with a 9" screen no more than the future was a 9" black & white screen in a box. It’s the paradigm that survives. (Kroc Camen)
Проверь себя! Онлайн тестирование | Мой блог
mutabor вне форума Ответить с цитированием
Старый 14.02.2009, 07:44   #10
Ja`
Пользователь
 
Аватар для Ja`
 
Регистрация: 12.02.2009
Сообщений: 11
По умолчанию

Цитата:
Сообщение от mutabor Посмотреть сообщение
Можно просто в TStrings его погрузить методом LoadFromFile. А можно так: TFileStream ---> TMemoryStream, и он в памяти.
Спасибо, будем знать(:
Ja` вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
цикл...и по ходу бесконечный... victum Помощь студентам 10 07.01.2009 15:57
Бесконечный цикл(visual c++) JOFRIF Visual C++ 10 26.08.2008 22:43
Требуется помощь! Svetax2 Помощь студентам 0 06.06.2008 19:30
Бесконечный цикл Эдуард Общие вопросы C/C++ 4 03.04.2008 17:28
Помощь в оптимизации anger Общие вопросы Delphi 13 05.11.2007 13:15