![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация скорости вывода на екран с помощью Label [D7, XP]
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);- предпочтителен если Slide - явная функция от времени(то бишь "шаг" между состояними произвольный, например: прямолинейное равноускренное движение) и/или вычисление занимет мало времени...
var state: TState;
begin
state:= Slide(FState, Now);
FState:= state.
Show(FState);
end;
ВНИМАНИЕ: Если в 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 знаков после запятой??