Другие языки программирования и технологии

Написал небольшой код на делфи. Почему не работает?

Хочу самостоятельно проверить количество простых арифметических операций которые совершает процессор.
Сделал бесконечный цикл, который постоянно увеличивает переменную и выводит ее:
begin
i:=1;
while i<>0 do begin
label1.Caption:=inttostr(i);
end;
Ожидал увидеть увеличивающееся число в label1.
При запуске программа зависает и выводить ничего не хочет.
Почему так? И как заставить работать?
Application.ProcessMessages в цикле.

Только это Вам не даст того, что Вы хотите.
Вы только получите колво-обновлений окна в текущем потоке. Даже не тактов. Операций происходит несоизмеримо больше. Системные очереди, сообщения, другие приложения, драйвера - всё это требует простейших мат. операций и Вы не отследите сколько. Даже в потоке с наивысшим приоритетом. Но можно оценить примерно сколько можно "отжать" у ОС =)

P.S: Сорян - увидел ответы слегка позже =)
Вечный Байкер
Вечный Байкер
84 764
Лучший ответ
Шерзод Султанов Пожалуй самое точное описание того что мне нужно и есть "Но можно оценить примерно сколько можно "отжать" у ОС =)".
Отдельный поток для вычислений и отрисовки оказался решением.
Такие вещи так не делаются.
Хочешь сделать какой-то benchmark - алгоритм примерно такой:

1. Назначаем своему процессу приоритет Realtime. Желательно его запустить с Affinity mask на какое-то одно ядро, чтобы винда не умничала в процессе.
2. Засекаем текущее время.
3. Выполняем определенное количество действий, а не бесконечный цикл. Действия, написанные в виде ассемблерной вставки, будут предпочтительнее - тогда ты точно будешь знать, что именно там выполнялось, а не что компилятор наваял для тебя.
4. Засекаем текущее время и сравниваем с пунктом 2.
5. Делим количество операций на разницу во времени - получаем бенч для одного ядра.

Но даже это от лукавого, поскольку виндоза - не Realtime-система, у нее свои понятия о выполнении чего угодно.
правильно что зависает. когда ей заниматся прорисовкой, если она в цикле висит. что бы не висло - изучай потоки
мало того, что нет инкрементирования счетчика, так прога еще и тупо не успевает обработать очередь сообщений на отрисовку.
надо ещё Application.ProcessMessages в цикл подпихнуть. но это уже не будет "количество простых арифметических операций"
Илья Вдовкин
Илья Вдовкин
57 394
Шерзод Султанов увеличение i есть в проге, сюда криво скопировал.
Application.ProcessMessages как это работает?
i=:i+1; в этом вся причина
Влад Жур
Влад Жур
55 735
в других языка или языке увеличение значит i++;
ну или i+=1;
и что это не знаю так должно быть или нет <> что это по твоему и ты уверен что правильно?
а у тебя просто inttostr(i); и еще может быть inttostr нужно большими ну именно так IntToStr
Скорее WinApi привязан жестко к регистру букв от него ко всему наверно и пошло, вроде верхний это большие буквы а нижний это маленькие. ну и привязан это если чуть не то или маленькая или большая и все не работает.
например у меня в программе недавно While не работало, написал while заработало.
VM
Vadim Milyutin
3 061