Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с паузами, Паузы 2, работает почему-то одна. 
:(
    Опции темы
BlHol
Дата 29.4.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



День добрый!

Есть обработчик:

Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 long int i;
 long int k;
  for(i=0;i<=1000000000;i++);
  Label1->Font->Color = clGreen;
  i=0;


  for(k=0;k<=100000000;k++);
    Form1->Label2->Font->Color = clBlue;
  }


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

Поэтому вопроса 2:
1. Почему так происходит?
2. Как решить проблему? 


Заранее благодарен.
С уважением. 

Это сообщение отредактировал(а) BlHol - 29.4.2006, 10:24
PM MAIL   Вверх
BreakPointMAN
Дата 29.4.2006, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 725
Регистрация: 15.9.2004
Где: Saratov

Репутация: 14
Всего: 24



и да поможет тебе
Код
Application->ProcessMessages();

перед вторым циклом (кстати, у него в 10 раз меньше итераций, чем у первого - это так задумано?), а вообще говоря, для таких дел лучше использовать компонент TTimer (вкладка System палитры компонентов C++ Builder) 

Это сообщение отредактировал(а) BreakPointMAN - 29.4.2006, 12:17


--------------------
"Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце")
PM WWW ICQ   Вверх
BlHol
Дата 29.4.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Я количество итераций и уменьшал и увеличивал. Те же яйца... 
PM MAIL   Вверх
Hose
Дата 2.5.2006, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.4.2006

Репутация: 1
Всего: 1



Возможно умный компилятор просто переделывает строку 
Код

  for(i=0;i<=1000000000;i++);
 в 
Код

i = 1000000000;
 которая выполняется намного быстрее и приводит абсолютно к такому же результату. 
PM MAIL   Вверх
BlHol
Дата 2.5.2006, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Цитата(Hose @ 2.5.2006,  09:16)
Возможно умный компилятор просто переделывает строку 
Код

  for(i=0;i<=1000000000;i++);
 в 
Код

i = 1000000000;
 которая выполняется намного быстрее и приводит абсолютно к такому же результату.

И как с этим бороться? 
PM MAIL   Вверх
adonin
Дата 2.5.2006, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 16.12.2005
Где: Новочеркасск Рост овская обл.

Репутация: 2
Всего: 5



Цитата(Hose @  2.5.2006,  09:16 Найти цитируемый пост)
 которая выполняется намного быстрее и приводит абсолютно к такому же результату

Ни один компилятор не будет делать такого глубокого анализа кода, чтобы заменять или убирать писанные конструкции. Тем более, что это может нарушить логику программы, программа будет делать не то, что хотел от неё кодер (или не так).
Цитата(BlHol @  29.4.2006,  10:23 Найти цитируемый пост)
Так вот. После нажатия на кнопку хочу увидеть, как текст на метке после первой паузы окрашивается сначала в зеленый, а потом после второй паузы в синий. 
А в результате, окрашивание текста происходит сразу в синий. Т.е. такое впечатление, что первая пауза не срабатывает. 

В таком случае не срабатывает вторая пауза (Нет задержки между окрашиваниями). Увеличте её.
Такой способ задержки - очень не правильно!!!!!!! 
Через год выйдут процессоры, которые будут выполнять твои циклы так быстро, что ты не увидишь задержки вообще.
Используй таймеры. 
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР)
PM MAIL   Вверх
Hose
Дата 2.5.2006, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.4.2006

Репутация: 1
Всего: 1



Цитата(adonin @  2.5.2006,  09:54 Найти цитируемый пост)
Ни один компилятор не будет делать такого глубокого анализа кода, чтобы заменять или убирать писанные конструкции. Тем более, что это может нарушить логику программы, программа будет делать не то, что хотел от неё кодер (или не так).


открываем VS 2003
создаем консольное приложение
текст программы:

Код

int main()
{
    unsigned long i = 0;
    unsigned long j = 0;
    for (i = 0; i < 1000000000; i++)
        for (j = 0; j < 1000000000; j++);    
    int n = i + j;
    printf("%d", n);
    return 0;
}


Залезаем в свойства проекта и ставим оптимизацию maximum speed
запускаем
По моим скромным и весьма оптимистичным подсчетам данный цикл должен выполняться около 10 лет.
Не проходит и секунды, на экране верный результат.

Добавлено @ 10:38 
Цитата(BlHol @  2.5.2006,  09:45 Найти цитируемый пост)
И как с этим бороться?

я так понимаю, ты пишешь в билдере. Я его в глаза не видел но подозреваю, что в нем месть свойства проекта и наверняка можно отключить оптимизацию. 
в VS 2003 это делается так:
меню Project-> Properties->C/C++->optimisation->optimisation->disable
но
Цитата(adonin @  2.5.2006,  09:54 Найти цитируемый пост)
Такой способ задержки - очень не правильно!!!!!!!
...
Используй таймеры. 

 

Это сообщение отредактировал(а) Hose - 2.5.2006, 10:32
PM MAIL   Вверх
BlHol
Дата 2.5.2006, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Цитата(Hose @  2.5.2006,  09:16 Найти цитируемый пост)
 В таком случае не срабатывает вторая пауза (Нет задержки между окрашиваниями). Увеличте её.
Такой способ задержки - очень не правильно!!!!!!! 
Через год выйдут процессоры, которые будут выполнять твои циклы так быстро, что ты не увидишь задержки вообще.
Используй таймеры.

Тогда вопрос: почему срабатывает первая пауза и не срабатывает вторая при одинаковых строках кода?

Я уже пробовал увеличивать счетчик во втором цикле, результат тот же.

Я понимаю, что "очень неправильно". Даже с таймером ужо разобрался, а это так, задачка в свободное время. Интерес, чисто, спортивный.

Заранее благодарен.
С уважением. 
PM MAIL   Вверх
Hose
Дата 2.5.2006, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 11.4.2006

Репутация: 1
Всего: 1



Кстати у тебя в коде в зеленый цвет окрашивается Label1, а в синий Label2. А из текста создалост впечатление, что ты хочешь один и тотже текст раскрашивать. Возиожно в этом ошибка
 
PM MAIL   Вверх
adonin
Дата 2.5.2006, 11:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 16.12.2005
Где: Новочеркасск Рост овская обл.

Репутация: 2
Всего: 5



Цитата(Hose @  2.5.2006,  10:30 Найти цитируемый пост)
По моим скромным и весьма оптимистичным подсчетам данный цикл должен выполняться около 10 лет.
Не проходит и секунды, на экране верный результат

Очень интересно, Откомпилял Ваш код с опцией "Assembly with source code". Компилятор VC++ 6.0.
Ни какой оптимизации нету:
Код

_main    PROC NEAR

; 7    : {

    push    ebp
    mov    ebp, esp
    sub    esp, 12                    ; 0000000cH

; 8    :     unsigned long i = 0;

    mov    DWORD PTR _i$[ebp], 0

; 9    :     unsigned long j = 0;

    mov    DWORD PTR _j$[ebp], 0

; 10   :     //for (i = 0; i < 1000000000; i++)
; 11   :         for (j = 0; j < 1000000000; j++);    

    mov    DWORD PTR _j$[ebp], 0
    jmp    SHORT $L530
$L531:
    mov    eax, DWORD PTR _j$[ebp]
    add    eax, 1
    mov    DWORD PTR _j$[ebp], eax
$L530:
    cmp    DWORD PTR _j$[ebp], 1000000000        ; 3b9aca00H
    jae    SHORT $L532
    jmp    SHORT $L531
$L532:

; 12   :     int n = i + j;

    mov    ecx, DWORD PTR _i$[ebp]
    add    ecx, DWORD PTR _j$[ebp]
    mov    DWORD PTR _n$[ebp], ecx

; 13   :     printf("%d", n);

    mov    edx, DWORD PTR _n$[ebp]
    push    edx
    push    OFFSET FLAT:$SG534
    call    _printf
    add    esp, 8

; 14   :     return 0;

    xor    eax, eax

; 15   : }

    mov    esp, ebp
    pop    ebp
    ret    0
_main    ENDP
_TEXT    ENDS
END

Смотрите прыжки на метки $L531: и $L532: - это и есть цикл.

Добавлено @ 11:24 
Hose, Вы правы! VS 2003 в релизе заменил пустой цикл на i=1000000000!!!
BlHol, чтобы этого избежать, отключите оптимизацию в компиляторе, или делайте так:
Код

int main()
{
    unsigned long i = 0;
    unsigned long j = 0;
    for (i = 0; i < 1000000000; i++)
        for (j = 0; j < 1000000000; j++) _asm{nop};    
    int n = i + j;
    printf("%d", n);
    return 0;
}

nop - пустая команда, просто такты процессора кушает. И цикл не пустой, поэтому не оптимизируется.

Добавлено @ 11:32 
Hose, тебе плюс, я бы не додумался до тако объяснения. 

Это сообщение отредактировал(а) adonin - 2.5.2006, 11:26
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР)
PM MAIL   Вверх
BlHol
Дата 2.5.2006, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 126
Регистрация: 26.11.2005

Репутация: нет
Всего: нет



Цитата(Hose @ 2.5.2006,  11:13)
Кстати у тебя в коде в зеленый цвет окрашивается Label1, а в синий Label2. А из текста создалост впечатление, что ты хочешь один и тотже текст раскрашивать. Возиожно в этом ошибка

Сорри! Это я не совсем точно задачу описал. Есть 2 метки. Хочу, чтобы после 1-й паузы одна метка окрашивалась, а после 2-й, вторая (все в одном обработчике). Первая пауза выдерживается (1-я метка окрашивается после 1-го цикла), а вторая нет (т.е. 2-я метка окрашивается тут же). Т.е. складывается ощущение, что два цикла обрабатываются параллельно. Или почти параллельно...  

Это сообщение отредактировал(а) BlHol - 2.5.2006, 11:39
PM MAIL   Вверх
cozzzy
Дата 2.5.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 54
Регистрация: 29.4.2006
Где: Харьков

Репутация: нет
Всего: нет



BlHol, прочитай предыдущий пост  smile 

И вообще если хочешь паузу используй функцию Sleep 
PM MAIL   Вверх
armageddon
Дата 4.5.2006, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 117
Регистрация: 9.11.2005
Где: 239

Репутация: нет
Всего: нет



а почему нельзя, чтобы цикл был не пустой туда забить какаю нибудь не сложныу задачу, например проверка делимости считчика на некоторое число, чтобы результат суммировался.....
на мой взгляд должно сработать 
PM MAIL   Вверх
adonin
Дата 5.5.2006, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 166
Регистрация: 16.12.2005
Где: Новочеркасск Рост овская обл.

Репутация: 2
Всего: 5



Цитата(armageddon @  4.5.2006,  16:09 Найти цитируемый пост)
а почему нельзя, чтобы цикл был не пустой 

Можно. 
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР)
PM MAIL   Вверх
Coala
Дата 5.5.2006, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 4.5.2006
Где: Москва

Репутация: нет
Всего: 0



Код
void __fastcall TFMain::Button1Click(TObject *Sender) {
  // ждём 2000 миллисекунд после нажатия батона
  Sleep(2000);
  // меняем цвет
  Label1->Font->Color = clGreen;
  // гарантированно меняем
  Application->ProcessMessages();
  // ждём ещё 2000 мс
  Sleep(2000);
  Label2->Font->Color = clBlue;
  Application->ProcessMessages();
}
 
ЗЫ - вместо Sleep можно использовать цикл по GetTickCount, QueryPerformanceCounter или GetProcessTimes (если надо точно замерять интервал времени). У Sleep вообще-то точность - плюс-минус поллаптя. 

Это сообщение отредактировал(а) Coala - 5.5.2006, 13:57
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1103 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.