Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
14 / 14 / 4
Регистрация: 27.10.2012
Сообщений: 141

Зачем нужен TTimer если есть sleep?

25.11.2012, 17:03. Показов 2476. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Зачем нужен TTimer если есть sleep? Может я что-то не до конца понимаю. Всегда пользовался таймером для создания простых игр, например чтобы имаг перемещался по экрану (ставим значение 40, то есть 25 кадров в секунду, и пишем man1->Left++ к примеру). Недавно узнал про такую тему как sleep, у которой можно тоже задавать интервал срабатывания. Вот теперь думаю...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.11.2012, 17:03
Ответы с готовыми решениями:

Зачем нужен PaintBox, если рисовать можно на форме ?
Объясните пожалуйста чайнику:)

Как остановить TTimer, если курсор мышки вышел за пределы TImage?
У меня есть Panel1 размером 250 на 250. На нём помещён Image1. С помощью процедуры ImageMouseMove я перемещаю(только по горизонтали)...

Зачем нужен StringReader, если есть foreach?
Зачем нужен StringReader, если есть foreach?

18
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
11.02.2013, 13:50
затем что у таймера в промежутках между тиками могут работать любые другие функции твоей программы, а sleep будучи помещенным в бесконечный цикл одной из процедур твоей программы заткнет ее полностью. разве что ты этот sleep в отдельном потоке делать будешь. тогда - ок
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.02.2013, 13:50
Таймер это таймер, а Sleep() "подвешивает"основной поток....
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
11.02.2013, 13:54
Цитата Сообщение от Avazart Посмотреть сообщение
подвешивает
он отдает это время системе. но со стороны нашего потока конечно же это выглядит как подвешивание
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.02.2013, 14:02
Цитата Сообщение от ithyphallic Посмотреть сообщение
Зачем нужен TTimer если есть sleep? Может я что-то не до конца понимаю. Всегда пользовался таймером для создания простых игр, например чтобы имаг перемещался по экрану (ставим значение 40, то есть 25 кадров в секунду, и пишем man1->Left++ к примеру). Недавно узнал про такую тему как sleep, у которой можно тоже задавать интервал срабатывания. Вот теперь думаю...
слып - запрашивает интервал сна, а не срабатывания, то есть если ты тупо в тексте клика на конпке напишешь слып, в конце, то ничего не получится, повторая твоя кнопка не кликнется, слыпать надо в цикле. И даже если ты слыпанёшь в цикле, то это ещё надо сделать во вторичном потоке, иначе на время твоего слыпа форма блокируется и ввести команду всё равно нельзя. Ну так если ты знаешь потоки, то и без слыпа отлично сделаешь любую анимацию, а слып нужен за тем, чтоб понизить приоритет потока в определённом месте и при длительно многократном его повторе дать камню возможность быстро решать другие задачи. А таймер всё берёт на себя и уже имеет минимально возможный приоритет.

Добавлено через 2 минуты
И больше 19-ти на таймер не выставишь, ставь хоть одну миллисекунду, а разрешение всё равно 54.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.02.2013, 14:03
Цитата Сообщение от taras atavin Посмотреть сообщение
И больше 19-ти на таймер не выставишь, ставь хоть одну миллисекунду, а разрешение всё равно 54.
Реально для TTimer ~300
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.02.2013, 14:08
Сказки не рассказывай.
0
83 / 78 / 14
Регистрация: 14.06.2012
Сообщений: 261
11.02.2013, 14:09
Тебе бы понравилось, если бы GTA чуть-чуть но подтормаживала?)
Вот поэтому используется TTimer, т.к. sleep() замораживает весь процесс, то бишь, как сказал уважаемый Avazart, основной поток.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
11.02.2013, 14:11
taras atavin, Возьми и попробуй...

Добавлено через 1 минуту
Цитата Сообщение от Neal Посмотреть сообщение
Тебе бы понравилось, если бы GTA чуть-чуть но подтормаживала?)
Вот поэтому используется TTimer, т.к. sleep() замораживает весь процесс, то бишь, как сказал уважаемый Avazart, основной поток.
Таймер тоже подвешивает но только на момент выполнения операций в нем...
И про подвешиванием имею ввиду подвешивание формы.
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
11.02.2013, 14:14
Пробовал. Десятки тысячь раз.

Добавлено через 1 минуту
Цитата Сообщение от Neal Посмотреть сообщение
т.к. sleep() замораживает весь процесс, то бишь, как сказал уважаемый Avazart, основной поток.
sleep усыпляет только тот поток, в котором вызван, обычно вторичный.
0
14 / 14 / 4
Регистрация: 27.10.2012
Сообщений: 141
12.02.2013, 20:46  [ТС]
Всем спасибо за разъяснения. Тогда ещё один вопрос. Уместо ли делать таймер в такой игре:
- 3D, вид сверху чуть под наклоном;
- территория состоит из клеточек, перемещение вверх-вниз-влево-вправо на одну клетку плавно (как в первом и втором варкрафте);
- ходишь мужиком по лесу, кромсаешь мобов и т.п.

Пока делаю логику с примитивными спрайтами, графика планируется на OpenGL.

То есть хочу сказать, что игра будет вроде бы не тяжелая, но и не простенькая. Уместно ли использовать Timer или существуют более удобные аналоги?
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
12.02.2013, 22:45
Цитата Сообщение от ithyphallic Посмотреть сообщение
Зачем нужен TTimer если есть sleep? Может я что-то не до конца понимаю. Всегда пользовался таймером для создания простых игр, например чтобы имаг перемещался по экрану (ставим значение 40, то есть 25 кадров в секунду, и пишем man1->Left++ к примеру). Недавно узнал про такую тему как sleep, у которой можно тоже задавать интервал срабатывания. Вот теперь думаю...
TTimer (класс) - это упрощённая реализация создания нового потока, по-умолчанию зацикленного.
Sleep (функция) - это временная пауза действий в текущем потоке.

Соответственно, TTimer может быть с лёгкостью заменён с помощи TThread + Sleep.

И пожалуй, перенаправлю тему в раздел С++ Builder...
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
12.02.2013, 22:53
Цитата Сообщение от MikeSoft Посмотреть сообщение
TTimer (класс) - это упрощённая реализация создания нового потока, по-умолчанию зацикленного.
Я б так не сказал ... не потока, а системного таймера если я не ошибаюсь.

Цитата Сообщение от MikeSoft Посмотреть сообщение
Соответственно, TTimer может быть с лёгкостью заменён с помощи TThread + Sleep.
Но не забывая о синхронизации ... ибо Canvas на котором будет прорисовка - разделяемый ресурс
1
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
13.02.2013, 00:15
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int N1, N2;
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{ Timer1->Interval=1;
    N1=GetTickCount();
    N2=0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{   N2++;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{ Timer1->Enabled=false;
    Label1->Caption=GetTickCount()-N1;
    Label2->Caption=N2;
}
Итог N1=6162, N2=395;

Добавлено через 4 минуты
Цитата Сообщение от MikeSoft Посмотреть сообщение
TTimer (класс) - это упрощённая реализация создания нового потока, по-умолчанию зацикленного.
Sleep (функция) - это временная пауза действий в текущем потоке.
C++
1
2
3
4
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{   for(;;)
        Sleep(1);
}
или
C++
1
2
3
4
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{   for(;;)
        int a=0;
}
результат - висящая форма. Вывод Timer1 выполняется в основном потоке.
1
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
13.02.2013, 00:26
Цитата Сообщение от Avazart Посмотреть сообщение
не потока, а системного таймера если я не ошибаюсь.
Согласен.
Цитата Сообщение от Avazart Посмотреть сообщение
Но не забывая о синхронизации ... ибо Canvas на котором будет прорисовка - разделяемый ресурс
Вообще-то к VCL-объектам по-другому и нельзя подлазить...
Цитируя справку:
Important: Methods and properties of objects in VCL can only be used in a method called using Synchronize
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.02.2013, 00:45
Ну тут неопределённо сказано... ведь то к тому что не участвует в перерисовке можно обращаться как я понял ибо не должно быть конфликтов с основным потоком.

Например тот же IdHTTP или простой TStringList

Добавлено через 16 минут
На форуме много тем наплодилось про рисование и потоки

Зависает изображение на форме
Управление потоками

Вот я даже пример когда-то выкладывал с потоком https://www.cyberforum.ru/post3959362.html
0
Эксперт С++
 Аватар для MikeSoft
3956 / 1811 / 184
Регистрация: 21.11.2009
Сообщений: 2,540
13.02.2013, 00:57
Avazart, неопределённо сказано из-за того, что VCL - изначально потоконебезопасная. Соответственно, лучше дополнительно предупредить разработчиков, чем до момента корректных исправлений получать огромное количество жалоб. К тому же, большинство знает, что всё связанно с GUI должно иметь приоритет и блокироваться для доступа извне.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
13.02.2013, 00:59
Тут есть пример и исходники TIdThreadComponent тоже с рисованием https://www.cyberforum.ru/post4060889.html
0
14 / 14 / 4
Регистрация: 27.10.2012
Сообщений: 141
13.02.2013, 00:59  [ТС]
Цитата Сообщение от ithyphallic Посмотреть сообщение
Всем спасибо за разъяснения. Тогда ещё один вопрос. Уместо ли делать таймер в такой игре:
- 3D, вид сверху чуть под наклоном;
- территория состоит из клеточек, перемещение вверх-вниз-влево-вправо на одну клетку плавно (как в первом и втором варкрафте);
- ходишь мужиком по лесу, кромсаешь мобов и т.п.

Пока делаю логику с примитивными спрайтами, графика планируется на OpenGL.

То есть хочу сказать, что игра будет вроде бы не тяжелая, но и не простенькая. Уместно ли использовать Timer или существуют более удобные аналоги?
Прислушаюсь к вашему мнению
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.02.2013, 00:59
Помогаю со студенческими работами здесь

Зачем нужен initonly, если есть const?
САБЖ. Возможно нубовские вопросы, зарание спасибо :) 1. Зачем нужен initonly если есть const 2. как правильно и в чем разница...

Зачем нужен StringWriter, если есть StringBuilder?
Зачем нужен StringWriter, если есть StringBuilder?

Зачем нужен тип private, если есть protected?
зачем нужен тип private если есть protected??? одного не достаточно? ведь свойства те же. и даже лучше...

Зачем нужен контроллер API если есть контроллер MVC?
Вопрос с собеседования. И так, понятно что API контролер ограничен относительно контроллера MVC. Не смог ответить зачем иммено его создали,...

cmd - зачем нужен если не возможно прочесть
Как там прочесть по-каковски написано. Набираешь команду: ipconfig /all и видишь на марсианском что-то. А мне нужен MAC adress. Win 7, x64,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru