![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
BlHol |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 26.11.2005 Репутация: нет Всего: нет |
День добрый!
Есть обработчик:
Так вот. После нажатия на кнопку хочу увидеть, как текст на метке после первой паузы окрашивается сначала в зеленый, а потом после второй паузы в синий. А в результате, окрашивание текста происходит сразу в синий. Т.е. такое впечатление, что первая пауза не срабатывает. Поэтому вопроса 2: 1. Почему так происходит? 2. Как решить проблему? Заранее благодарен. С уважением. Это сообщение отредактировал(а) BlHol - 29.4.2006, 10:24 |
|||
|
||||
BreakPointMAN |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 725 Регистрация: 15.9.2004 Где: Saratov Репутация: 14 Всего: 24 |
и да поможет тебе
перед вторым циклом (кстати, у него в 10 раз меньше итераций, чем у первого - это так задумано?), а вообще говоря, для таких дел лучше использовать компонент TTimer (вкладка System палитры компонентов C++ Builder) Это сообщение отредактировал(а) BreakPointMAN - 29.4.2006, 12:17 -------------------- "Разруха не в клозетах, а в головах." © Ф.Ф. Преображенский (М.Булгаков, "Собачье сердце") |
|||
|
||||
BlHol |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 26.11.2005 Репутация: нет Всего: нет |
Я количество итераций и уменьшал и увеличивал. Те же яйца...
|
|||
|
||||
Hose |
|
||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 11.4.2006 Репутация: 1 Всего: 1 |
Возможно умный компилятор просто переделывает строку
|
||||
|
|||||
BlHol |
|
||||||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 26.11.2005 Репутация: нет Всего: нет |
И как с этим бороться? |
||||||
|
|||||||
adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 2 Всего: 5 |
Ни один компилятор не будет делать такого глубокого анализа кода, чтобы заменять или убирать писанные конструкции. Тем более, что это может нарушить логику программы, программа будет делать не то, что хотел от неё кодер (или не так). В таком случае не срабатывает вторая пауза (Нет задержки между окрашиваниями). Увеличте её. Такой способ задержки - очень не правильно!!!!!!! Через год выйдут процессоры, которые будут выполнять твои циклы так быстро, что ты не увидишь задержки вообще. Используй таймеры. --------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
Hose |
|
||||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 11.4.2006 Репутация: 1 Всего: 1 |
открываем VS 2003 создаем консольное приложение текст программы:
Залезаем в свойства проекта и ставим оптимизацию maximum speed запускаем По моим скромным и весьма оптимистичным подсчетам данный цикл должен выполняться около 10 лет. Не проходит и секунды, на экране верный результат. Добавлено @ 10:38 я так понимаю, ты пишешь в билдере. Я его в глаза не видел но подозреваю, что в нем месть свойства проекта и наверняка можно отключить оптимизацию. в VS 2003 это делается так: меню Project-> Properties->C/C++->optimisation->optimisation->disable но
Это сообщение отредактировал(а) Hose - 2.5.2006, 10:32 |
||||
|
|||||
BlHol |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 26.11.2005 Репутация: нет Всего: нет |
Тогда вопрос: почему срабатывает первая пауза и не срабатывает вторая при одинаковых строках кода? Я уже пробовал увеличивать счетчик во втором цикле, результат тот же. Я понимаю, что "очень неправильно". Даже с таймером ужо разобрался, а это так, задачка в свободное время. Интерес, чисто, спортивный. Заранее благодарен. С уважением. |
|||
|
||||
Hose |
|
|||
Новичок Профиль Группа: Участник Сообщений: 29 Регистрация: 11.4.2006 Репутация: 1 Всего: 1 |
Кстати у тебя в коде в зеленый цвет окрашивается Label1, а в синий Label2. А из текста создалост впечатление, что ты хочешь один и тотже текст раскрашивать. Возиожно в этом ошибка
|
|||
|
||||
adonin |
|
||||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 2 Всего: 5 |
Очень интересно, Откомпилял Ваш код с опцией "Assembly with source code". Компилятор VC++ 6.0. Ни какой оптимизации нету:
Смотрите прыжки на метки $L531: и $L532: - это и есть цикл. Добавлено @ 11:24 Hose, Вы правы! VS 2003 в релизе заменил пустой цикл на i=1000000000!!! BlHol, чтобы этого избежать, отключите оптимизацию в компиляторе, или делайте так:
nop - пустая команда, просто такты процессора кушает. И цикл не пустой, поэтому не оптимизируется. Добавлено @ 11:32 Hose, тебе плюс, я бы не додумался до тако объяснения. Это сообщение отредактировал(а) adonin - 2.5.2006, 11:26 --------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
||||||
|
|||||||
BlHol |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 126 Регистрация: 26.11.2005 Репутация: нет Всего: нет |
Сорри! Это я не совсем точно задачу описал. Есть 2 метки. Хочу, чтобы после 1-й паузы одна метка окрашивалась, а после 2-й, вторая (все в одном обработчике). Первая пауза выдерживается (1-я метка окрашивается после 1-го цикла), а вторая нет (т.е. 2-я метка окрашивается тут же). Т.е. складывается ощущение, что два цикла обрабатываются параллельно. Или почти параллельно... Это сообщение отредактировал(а) BlHol - 2.5.2006, 11:39 |
|||
|
||||
cozzzy |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 29.4.2006 Где: Харьков Репутация: нет Всего: нет |
BlHol, прочитай предыдущий пост
![]() И вообще если хочешь паузу используй функцию Sleep |
|||
|
||||
armageddon |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 117 Регистрация: 9.11.2005 Где: 239 Репутация: нет Всего: нет |
а почему нельзя, чтобы цикл был не пустой туда забить какаю нибудь не сложныу задачу, например проверка делимости считчика на некоторое число, чтобы результат суммировался.....
на мой взгляд должно сработать |
|||
|
||||
adonin |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 16.12.2005 Где: Новочеркасск Рост овская обл. Репутация: 2 Всего: 5 |
--------------------
Тот, кто слизывает мед с крапивы, платит за него слишком дорого. (Томас ФУЛЛЕР) |
|||
|
||||
Coala |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 70 Регистрация: 4.5.2006 Где: Москва Репутация: нет Всего: 0 |
ЗЫ - вместо Sleep можно использовать цикл по GetTickCount, QueryPerformanceCounter или GetProcessTimes (если надо точно замерять интервал времени). У Sleep вообще-то точность - плюс-минус поллаптя. Это сообщение отредактировал(а) Coala - 5.5.2006, 13:57 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |