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 тактов процессора на одно обновление значения)) и заметил что в некоторых случаях загружаются разные ядра процессора (но одновременно только одно). Спасибо за ответы.


GVas   (2009-01-24 00:18:00) [1]

Servy
Спасибо за совет, действительно, наблюдается нехватка теоретических знаний, и я склоняюсь к тому, что придется браться за какую-то серьезную книгу.


Servy   (2009-01-24 00:07:00) [2]

> смотрел значение переменной i почему то значение шло не
> от единицы до 1992 а наоборот с 1992 до 1 почему так

Потому что процессору проще проверять, сравнялось ли i с нулем, чем с 1992. Выключи галку Optimization в настройках компилятора, будет все по-честному. Условия будут работать правильно, это отдается на откуп компилятору, верь в него :). Для отладки оптимизацию как правило выключают.


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


Зависит от того, где расположен массив. Есть массив суть локальная переменная, память под которую выделяется в стеке, то в массиве изначально будет мусор. Если массив это поле класса, то при создании экземпляра этого класса массив будет обнулен. В остальных случаях, насколько мне известно, нулевое значение переменных не гарантируется и рассчитывать на него не стоит.

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


GVas   (2009-01-23 23:46:00) [3]

AndreyV
Спасибо Вам за ответы


GVas   (2009-01-23 23:42:00) [4]

и еще момент увидел при работе цикла
for i := 1 to 1992 do
 begin
   readln(F_DM_ATOM,S_DM_ATOM);
   readln(F_Z_ATOM,S_Z_ATOM);
   readln(F_N_ATOM,S_N_ATOM);
   i1[i,1]:=StrToInt(S_N_ATOM);
   i1[i,2]:=StrToFloat(S_Z_ATOM);
   i1[i,3]:=StrToFloat(S_DM_ATOM);
 end;
смотрел значение переменной i почему то значение шло не от единицы до 1992 а наоборот с 1992 до 1 почему так, и как исправить такую ситуацию??? хотя масив заполнялся правильно с начала и до конца, но вопрос стоит в том что если будет условие на i вроде если и больше единицы то то то и то то, получается что это условие будет неправильно работать, и второй момент при создании массива я его не обнулял, при просмотре значений почти все значения были нулями, но некоторые были заполнены вещественными числами, хотя я кажись вычитывал в этой ветке обсуждение насчет того что необходимсоти обнуления нет.


AndreyV   (2009-01-23 23:33:00) [5]

> [44] GVas ©   (23.01.09 23:09)
> Ясно, спасибо Вам за подсказку (но если количество параметров
> (i1 и i2) разное тогда каким образом поступить? так как
> у меня или как то по другому???).

Может тебе надо что-то такое

 Atom = record
 i : integer;
 x, y, z : Real;
 end;

Ты про модель ничего не уточнял.

> И второй момент почитал хелп о Critical Section в делфе...
> при срабатывании таймера образуетсяпоток который должен
> взять начальные параметры, обработать их и записать на место

Поток уже есть

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

Один поток рассчитывает, второй по таймеру забирает у него результаты и выводит.
Никакого задвоения переменных нет.


GVas   (2009-01-23 23:09:00) [6]

Ясно, спасибо Вам за подсказку (но если количество параметров (i1 и i2) разное тогда каким образом поступить? так как у меня или как то по другому???). И второй момент почитал хелп о Critical Section в делфе, приблизительно понял что это секция с защищенными от изменения переменными, но я еще немного подумал и решил все таки конкретезировать, мб я неправильно выразился, есть начальные параметры системы, при срабатывании таймера образуется поток который должен взять начальные параметры, обработать их и записать на место старых значений значения новые, но тогда получается что для хранения переменных я буду использовать в два раза больше памяти, для основного и второстепенного потока, или я где то ошибаюсь?


AndreyV   (2009-01-23 22:53:00) [7]

> [42] GVas ©   (23.01.09 22:42)
> Я так понял что-то вроде этого:
> type
> Atom =record
> i1:array[1..10] of integer;
> i2:array[1..20] of Real;
>
> обращение к конкретному елементу Atom.i1[1]:=23 Atom.i2[3]:
> =25.6


type
 Atom = record
 i : integer;
 r : Real;
 end;

var
 a : array[1..10] of Atom;


GVas   (2009-01-23 22:42:00) [8]

Я так понял что-то вроде этого:
type
Atom =record
 i1:array[1..10] of integer;
 i2:array[1..20] of Real;

обращение к конкретному елементу Atom.i1[1]:=23 Atom.i2[3]:=25.6


AndreyV   (2009-01-23 22:33:00) [9]

> [40] GVas ©   (23.01.09 22:23)
> Ну и в догонку, каким образом можно в поток ввести какие
> либо данные из основной программы???

Читай о Critical Section

> И еще как сделать свой тип данных, например, чтоб он назывался
> myarrey и состоял из двух массивов заданного размера i1:
> array[1..10] of Integer; i2:array[1..10] of Real. обращение
> я так понимаю к отдельному елементу будет что то типа т1.и1
> или т1.и2.

Определи тип Record
а потом массив этих типов.


GVas   (2009-01-23 22:23:00) [10]

sniknik

> с чего у тебя в 31м посте та же ахинея что и в 0-м?


У меня там такие строки просто для проверки работоспособности потока, я во время работы цикла жал на вторую кнопку на форме и программа заканчивала свою работу, вот поэтому у меня там и цикл, просто чтоб проверить как поток работает, и смогу ли я выйти из программы во время работы цикла, а написал я насчет "я хотя бы приблизительно разобрался, а вот то что было написано уважаемым han_malign" имея ввиду пост № 27, я просто неправильно выразился((

Ну и в догонку, каким образом можно в поток ввести какие либо данные из основной программы???

И еще как сделать свой тип данных, например, чтоб он назывался myarrey и состоял из двух массивов заданного размера i1:array[1..10] of Integer; i2:array[1..10] of Real. обращение я так понимаю к отдельному елементу будет что то типа т1.и1 или т1.и2.


sniknik   (2009-01-23 22:03:00) [11]

> Ну ИМХО в том что я написал (скопировал, а потом переделал) я хотя бы приблизительно разобрался, а вот то что было написано уважаемым han_malign я
> больше половины не понимаю, как можно использовать код не понимая, что он делает
а то, что сам написал говоришь понимаешь? а то что я в первом, третьем посте написал, это по китайски? с чего у тебя в 31м посте та же ахинея что и в 0-м?


GVas   (2009-01-23 21:46:00) [12]


> т.е. все объяснения впустую... ;(, скорблю по так и не состоявшемуся
> программисту, и да здравствует будущий дворник! ;)

Ну ИМХО в том что я написал (скопировал, а потом переделал) я хотя бы приблизительно разобрался, а вот то что было написано уважаемым han_malign я больше половины не понимаю, как можно использовать код не понимая, что он делает
AndreyV спасибо за ответ, будем пытаться,

tesseract вот как хорошо получилось, продлил жизнь еще одному человеку))


tesseract   (2009-01-23 21:34:00) [13]


> почему то в Watch list не отображалось значение переменной


Давно так не ржал. Какую переменную ты хочешь посмотреть? Файл со своим именем связан,  как Фомич с бутылкой водки  - ему что на этикетке до фонаря.


AndreyV   (2009-01-23 21:28:00) [14]

> [32] GVas ©   (23.01.09 19:58)
> Подскажите пожалуйста как и с помощью чего лучше вывести
> на экран колонку строк размером хотя бы пару десятков строк.
> Спасибо за ответы.

А TLable уже не устраивает?
Если количество меняется, можно попробовать TStringGrid, как наиболее универсальный.


sniknik   (2009-01-23 21:27:00) [15]

> я же сделал вот так
т.е. все объяснения впустую... ;(, скорблю по так и не состоявшемуся программисту, и да здравствует будущий дворник! ;)

> вывести на экран колонку строк размером хотя бы пару десятков строк.
дбгрид

> Значение переменной не изменяется почему то, как быть???
бери упорством, меняй пока она не согласится с новым значением... :)


GVas   (2009-01-23 21:19:00) [16]

с присваиванием имени файла разобрался, почему то в Watch list не отображалось значение переменной


GVas   (2009-01-23 21:12:00) [17]

И в догонку пытаюсь присвоить переменной имя файла с помощью АssignFile(F,'C:\Program Files\Borland\Delphi7\Projects\1.txt')
Значение переменной не изменяется почему то, как быть???


GVas   (2009-01-23 19:58:00) [18]

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


GVas   (2009-01-15 21:08:00) [19]

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

procedure TForm1.Button1Click(Sender: TObject);

begin
 ModelThread.Create(False);
end;

это в подключаемом модуле

procedure ReactorThread.ShowResult;
begin
Form1.Edit1.Text := IntToStr(answer);
end;

цикл для примера взят, потом вместо него модель будет
procedure ModelThread.Execute;
var
i: Integer;
begin
for i := 1 to 10000 do
begin
answer := answer + 1;
Synchronize(ShowResult);
end;
end;


tesseract   (2009-01-15 13:59:00) [20]


> WaitForMultipleObject - согласен, но это ж сколько лишних
> строк писать(если уж меня заломало ветвление по флагу


Около 15 вроде. Считая интеграцию в класс потока.


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

Наверх

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