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

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

Оптимизация скорости вывода на екран с помощью Label [D7, XP]


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

GVas ©   (2009-01-04 14:53:00) 

Добрый день.
На форме вывожу информацию вот так

procedure TForm1.Button1Click(Sender: TObject);
var
i:Integer;
begin
 For i:=1 to 100000 do
   Begin
     Label1.Caption:=IntToStr(i);
     Label1.Refresh;
   End;
end;

оптимальна ли с точки быстродействия такая конструкция, потому как на довольно мощном компе такая по сути простая операция занимает довольно много времени (8 секунд где-то (или 200000 тактов процессора на одно обновление значения)) и заметил что в некоторых случаях загружаются разные ядра процессора (но одновременно только одно). Спасибо за ответы.


han_malign   (2009-01-15 13:47:00) [21]


> индусятина, при  waitforsingleobject  не нужен.

FSync:= CreateEvent(nil, not synchronous, true, nil);
если FSync - всегда взведен получим 100% загрузку CPU, что - в случае одного ядра - приведет как минимум к тормозам...
WaitForMultipleObject - согласен, но это ж сколько лишних строк писать(если уж меня заломало ветвление по флагу (FSynchronous:= synchronous) прописывать)...

З.Ы. в TThread1.Destroy - не забыть прибить FSync и FCrit(дабы не изменять религии)...


tesseract   (2009-01-15 13:28:00) [22]


> Sleep(0);//take a chance for other threads


индусятина, при  waitforsingleobject  не нужен. Использовать желательно WaitForMultipleObject  где одно из событий - приказ потоку сгинуть.


han_malign   (2009-01-15 13:21:00) [23]


> моделируется физический процесс, данные которые будут получены
> должны каждую секунду (или пару секунд) выдаваться на екран


State: Структура данных описывающих Состояниемодели.
Slide: Метод получения следующего Состояния
Show: Метод визуализации Состояниия

1.
TForm1.OnTimer(Sender: TObject);
var state: TState;
begin
   state:= Slide(FState, Now);
   FState:= state.
   Show(FState);
end;
- предпочтителен если Slide - явная функция от времени(то бишь "шаг" между состояними произвольный, например: прямолинейное равноускренное движение) и/или вычисление занимет мало времени...
ВНИМАНИЕ: Если в Slide вызывать ProcessMessages - может возникнуть рекурсия, если метод не уложится в интервал таймера
OnTimer{ Slide{ ProcessMessages{ GetMessage:WM_TIMER{ далее понятно } } } }
лечится флагом
if( FOnSlide = 0 )then begin
    inc(FOnSlide);
    ...
    dec(FOnSlide);
end;

2.
TThread1.Create(synchronous: boolean);
begin
   FSync:= CreateEvent(nil, not synchronous, true, nil);
   InitializeCriticalSection(FCrit);
   inherited Create(false);
end;
TThread1.Destroy;
begin
   Terminate;
   WakeUp;
   inherited;
end;
TThread1.Sleep;
begin
   ResetEvent(FSync);
end;
TThread1.WakeUp;
begin
   SetEvent(FSync);
end;
TThread1.Execute;
var nextFrame: integer;
begin
  while not Terminated of begin
      WaitForSingleObject(FSync, INFINITE);
      nextFrame:= FFrame + 1;
      if(nextFrame > High(FState))then nextFrame:= Low(FState);
      FState[nextFrame]:= Slide({in}FState[FFrame]);
      EnterCriticalSection(FCrit);
      FFrame:= nextFrame;
      LeaveCriticalSection(FCrit);
      Sleep(0);//take a chance for other threads
  end;
end;
TTread1.Snapshot: TState;
begin
    EnterCriticalSection(FCrit);
    Result:= FState[FFrame];
    LeaveCriticalSection(FCrit);
    WakeUp;
end;
..............
TForm1.OnTimer(Sender: TObject);
begin
   Show(FThread1.Snapshot);
end;


2.1.
TForm1.Show(state: TState);
begin
   if(FState.Ticker <> state.Ticker)then begin
     FState:= state;
     Invalidate;
   end;
end;
TForm1.OnPaint(Sender: TObject);
begin
    Draw(FState);
end;


GVas   (2009-01-14 22:41:00) [24]

Так, я поздравляю всех с праздником, желаю в новом году всем чтоб программы создавались на раз два, и без ошибок самое главное, спасибо всем кто помагал в создании программы, извините за сумбурность, праздник как никак


anonims   (2009-01-14 10:55:00) [25]

const pi=3.14;
       x2pi=2*pi;
       halfpi=pi/2;

var:=pi/2;
var:=halfpi;
в любом случае вычисление правой части берет на себя транслятор, т.е. в программном коде будет использовано уже вычисленное значение.
использвать вариант при котором читаемость программы будет выше

TiniFile Кead... Write...


GVas   (2009-01-13 22:51:00) [26]

Уважаемые еще вопрос по оптимизированности программы что лучше использовать? Есть довольно большое количество данных, которые в принципе константы, но их можно вычислить с помощью формулы, в программу лучше вбивать эту кучу констант (в массив например, с последующим использованием) или использовать формулу, ну и второй вопрос если есть данные в файле например текстовом, с помощью какой команды их можно присвоить какой то стринговой переменной и вобще какой формат файла использовать лучше? просто текст или дбф или еще какой??


Германн   (2009-01-05 00:22:00) [27]


> или для новых нужно открывать отдельную?

Если "новые" вопросы будут на темы не связанные никак с сабжем, то новую.


GVas   (2009-01-05 00:07:00) [28]

Если возможно не закрывайте тему чтоб я мог еще дописывать вопросы, или для новых нужно открывать отдельную?


GVas   (2009-01-05 00:05:00) [29]

Ясно, спасибо за помощь, всем кто участвовал, дельные и понятные ответы, ну сначала хотя бы написать в общем алгоритм работы, а как выводить метками или гистограммами это уже после того как напишу буду решать, для себя хотя бы метками чтобы было понятно что и как конкретно изменятся ,а вобще я думал просто подсвечивать фон тех параметров которые выходят за границу дозволенных режимов, и чтоб на ходу можно было подстраивать работу модели меняя в ту или иную сторону.


Anatoly Podgoretsky   (2009-01-04 23:45:00) [30]

> GVas  (04.01.2009 22:26:18)  [18]

Да тут сначала надо думать об смене индикации, обновление 200 меток раз в секунду, да пользователь свихнется. Цифровое представление не подходит, никто не в силах даже заметить в каких метках изменилась информация. Переходи на гистограммы.


sniknik   (2009-01-04 22:53:00) [31]

таймер. однозначно.


GVas   (2009-01-04 22:26:00) [32]

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


sniknik   (2009-01-04 22:00:00) [33]

> Application.Processmessage
это к параллельности процессов имеет слабое отношение... (если вообще хоть какое то)

> Учитывая что параллельно должен выполняться определенный набор команд ну скажем раз в секунду.
таймером не обойдешься?
если этот набор команд выполняется всего раз, в целую секунду, то значит комп у тебя в основном простаивает, и нет нужды париться с каким то там параллелизмом...


GVas   (2009-01-04 21:45:00) [34]

to Anatoly Podgoretsky
первый раз я использовал реал48 для того чтоб создать переменную вещественного типа потом узнал каким способом ее можно преобразовать, после того как начал считать число мелкое получилось не то какое я хотел, начал разбираться почему не то, сменил тип на екстендед, когда нет превышения все нормально, а когда есть то снова погрешность получается вот так.


GVas   (2009-01-04 21:29:00) [35]

Всю глубину своего заблуждения я понял, будем пользоваться тем что есть, а как лучше (или легче) организовать параллельные процессы в программе с помощью потоков или с помощью Application.Processmessage?? для начинающего. Учитывая что параллельно должен выполняться определенный набор команд ну скажем раз в секунду.


Anatoly Podgoretsky   (2009-01-04 21:03:00) [36]

> GVas  (04.01.2009 19:39:10)  [10]

Что то не то, то хватало Real48, а теперь не хватает Extended?
И объясни почему тебе нужна такая большая точность или ты просто так, что вижу, то и пою.


Anatoly Podgoretsky   (2009-01-04 21:01:00) [37]

> GVas  (04.01.2009 19:39:10)  [10]

Ситуация простая, никогда не использовать Real48 и читать что по этому поводу говорит справка,


sniknik   (2009-01-04 19:58:00) [38]

> а вот что делать если мне нужно больше чем 20 знаков после запятой??
путь до альфы центавра с точностью приземления до миллиметра вычитываешь?
дерзай. но это уже не стандарт, и считай стандартных типов таких нет. но есть библиотеки для работы с большими числами. ищи.


Сергей М.   (2009-01-04 19:56:00) [39]


> что делать если мне нужно больше чем 20 знаков после запятой?


Ты что, Левша лесковский ?


GVas   (2009-01-04 19:39:00) [40]

Ну из статьи я ситуацию понял, но пути ее решения кроме того что лучше вместо реала использовать екстендед, ну это по правде говоря я и експерементально получил, а вот что делать если мне нужно больше чем 20 знаков после запятой??


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

Наверх

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