Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.79/19: Рейтинг темы: голосов - 19, средняя оценка - 4.79
2 / 2 / 1
Регистрация: 26.11.2014
Сообщений: 34

Таймер времени через поток занимает 25 % ресурсов процессора

30.11.2014, 14:33. Показов 3709. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В сети нашел только этот пример таймера
в .h
C++
1
2
3
4
5
6
7
8
9
class timer : public TThread
{
private:
void inline __fastcall Vivod();
protected:
    void __fastcall Execute();
public:
    __fastcall timer(bool CreateSuspended);
};
в .cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int Seconds, Hours, Minutes;
//---------------------------------------------------------------------------
__fastcall timer::timer(bool CreateSuspended)
    : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall timer::Execute()
{
int time;
    //---- Place thread code here ----
    for (;;)
    {
     int time=GetTickCount();
     while (GetTickCount()-time<1000)
     {
        Application->ProcessMessages();
         }
         Seconds++;
         if (Seconds==60) {
             Minutes++;
             Seconds=0;
             Synchronize(&Vivod);
         }
         if (Minutes==60) {
             Minutes=0;
             Hours++;
             Synchronize(&Vivod);
         }
         Synchronize(&Vivod);
    }
}
void inline __fastcall timer::Vivod()
{
  Form->Labeltimer->Caption="Таймер: " +IntToStr(Hours)+":"+IntToStr(Minutes)+":"+IntToStr(Seconds)+" (чч:мм:cc)";
}
в FormCreate
C++
1
timer *FirstTimer= new timer(false);
всё работает, но постоянно пожирает 25% ресурсов процессора, что, как я считаю, непростительная роскошь для данного процесса.
Подскажите, пожалуйста, так и должно быть или тут какая то ошибка? или
Подкиньте, пожалуйста, пример работы таймера, реализованного по другому, чтобы съедало поменьше ресурсов.
Заранее, большое спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.11.2014, 14:33
Ответы с готовыми решениями:

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

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

FadeIn текстуры через таймер и процент от прошедшего времени
Доброго времени суток Бьюсь над проблемой уже неделю. В C# и monogame только начинаю, поэтому некоторых вещей, видимо, не понимаю. У...

13
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.11.2014, 15:47
"Таймер времени через поток занимает 25 % ресурсов "
Это не через поток, это через трудно доступные места. Весь код пример того как не надо делать.

Для таймера есть специальный компонент TTimer нефиг городить.
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
30.11.2014, 16:12
Bair107, у Вас получился программный таймер который при каждом проходе цикла "for(;;)" нагружает процессор. Лучше делать через таймер TTimer, как предлагает Avazart, вот пример размещение таймера в потоке:
h файл

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef Unit2H
#define Unit2H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.ExtCtrls.hpp>
//---------------------------------------------------------------------------
class Timer : public TThread
{
private:
    TTimer *Timer1;
    void __fastcall Timer1Timer(TObject *Sender);
    bool on;
protected:
    void __fastcall Execute();
public:
    __fastcall Timer(bool CreateSuspended);
};
//---------------------------------------------------------------------------
#endif
cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <System.hpp>
#pragma hdrstop
 
#include "Unit2.h"
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(&UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall Timer::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall Timer::Timer(bool CreateSuspended)
    : TThread(CreateSuspended)
{
 Timer1 = new TTimer(NULL);
 Timer1->Interval = 1000;
 Timer1->OnTimer = Timer1Timer;
 on = 0;
 Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall Timer::Execute()
{
  MSG  msg;
  while(GetMessage(&msg,NULL,0,0))
  {
    if(on == 1)
     {
      on = 0;
         //посылаешь своим Synchronize(&Vivod);
     }
  }
}
//---------------------------------------------------------------------------
void __fastcall Timer::Timer1Timer(TObject *Sender)
{
 on = 1;
}
Извините, писал на XE7, других компиляторов нет дома
1
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
30.11.2014, 18:40
А зачем в потоке вставляешь Application->ProcessMessages(); ?
0
2 / 2 / 1
Регистрация: 26.11.2014
Сообщений: 34
30.11.2014, 18:52  [ТС]
синхронизация с vcl потоком, т.е. ничего не делаем))

Пример брал с просторов интернета, автор пояснил это именно так.
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
30.11.2014, 19:10
Цитата Сообщение от Bair107 Посмотреть сообщение
синхронизация с vcl потоком, т.е. ничего не делаем))
Для этого есть функция Synchronize(&Vivod);
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.11.2014, 19:24
Цитата Сообщение от Bair107 Посмотреть сообщение
Пример брал с просторов интернета, автор пояснил это именно так.
Автор идиЁт.

Читайте книги, например Архангельского и смотрите в справку.
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
30.11.2014, 20:33
Bair107, используй мой пример, он рабочий только проверил , а что чужой код ругают, так тут народ злой не добрый

Добавлено через 8 минут
C++
1
2
3
4
5
6
7
for (;;)
    {
     int time=GetTickCount();
     while (GetTickCount()-time<1000)
     {
        Application->ProcessMessages();
         }
ИМХО:Народ взбесила вот эта конструкция, мало того что в автор выкладывает это, так еще не правильно пишет как это работает.
0
2 / 2 / 1
Регистрация: 26.11.2014
Сообщений: 34
30.11.2014, 20:49  [ТС]
Витальич, Большое спасибо, по вашему примеру и разобрался=)

Хаить не предлагая ничего взамен... старо как мир)
Ну а особо нетерпимым скидываю автора на растерзание)) http://www.youtube.com/watch?v=uPJhClvpR70
0
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
30.11.2014, 21:05
Цитата Сообщение от Bair107 Посмотреть сообщение
Ну а особо нетерпимым скидываю автора на растерзание))
ой вей, не смотрите больше этот канал, Вас там плохому научат.
Ну кто мой пример раскритикует, я в нем две оплошности вижу, а скорей всего их больше.
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
30.11.2014, 22:34
Цитата Сообщение от Bair107 Посмотреть сообщение
Хаить не предлагая ничего взамен... старо как мир)
Читать что тебе пишут научись, да и вообще читать научись) и глупо думать что можно научиться программированию по видео урокам, еще таким дебильным.

Витальич
1. Не инициализируется очередь сообщений.
2. То что ловятся все подряд сообщения, не смущает?
3. Как был цикл так и есть, и вероятно нагрузки нет только из-за синхронности GetMessage().
4. ...

Ссылки:
http://vsokovikov.narod.ru/New... essage.htm
http://vsokovikov.narod.ru/New... essage.htm

Но дальше не стоит продолжать, так как нет четкой задачи.

Добавлено через 11 минут
Витальич, кстати с подвигло использовать именно очередь сообщений? Почему не:
C++
1
2
3
4
5
6
7
8
9
void __fastcall Timer::Execute()
{
  t= GetTickCount();
  while(!Terminated)
  {
      Sleep(1000); // ждем приблизительно секунду, потом обновляем вывод на экран.
      Synchronize(&UpdateTime);
  }
}
1
 Аватар для Витальич
1280 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,883
30.11.2014, 22:39
Цитата Сообщение от Avazart Посмотреть сообщение
кстати с подвигло использовать именно очередь сообщений?
Привычка. Я больше Builder использую для работы со своими "железками" и с потоком через очередь работаю.
0
120 / 142 / 46
Регистрация: 31.10.2014
Сообщений: 721
Записей в блоге: 1
01.12.2014, 05:11
Ужас, ТС не смотри этот канал, автор канала всякий бред говорит, да еще к тому же городит в коде.
А поскольку это так, чтобы создать Timer тебе не нужно городить TThread, для этого есть компонент TTimer, который ты должен кинуть на форму.
0
02.12.2014, 08:43

Не по теме:

Цитата Сообщение от Bair107 Посмотреть сообщение
Ну а особо нетерпимым скидываю автора на растерзание))
Я плакал:D Особенно на словах "Щас я вам все объясню...", что в его устах прозвучало как угроза ввержения человечества в пучины сумасшествия. :rofl:

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2014, 08:43
Помогаю со студенческими работами здесь

Таймер и создание экземпляров через случайные интервалы времени
Здравствуйте господа Нуждаюсь в помощи реализации следующей задачи: имея таймер на форме с интервалом 1сек и функцией обработки тиков...

MS SQLSERVER занимает почти 100% ресурсов
Привет, народ! У меня проблема с MS SQLSERVER на клауд сервере. Параметры сервера 2 ядра, 4 гб ОЗУ. Server 2009 R2 SP1, SqlServer...

Сделать таймер, чтобы через указанное количество времени срабатывало прерывание и выполнялась заданная функция
Доброго времени суток. У меня такой вопрос, нужно сделать как бы диспетчер задач но вопрос не в этом, подскажите как сделать таймер чтобы...

Как узнать сколько места занимает один поток на сервере?
Приложение по типу клиент-сервер. Как узнать сколько места в оперативке будет занимать 1н поток (открытый сокет) при обработке запроса...

Как организовать задержку в 5 мс, которая не занимает ресурсы процессора?
Мне надо организовать задержку в 5 мс, которая не занимает ресурсы процессора. После долгих экспериментов выяснил, что функция API Sleep...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru