Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему процессор грузится на 99%

31K
20 августа 2007 года
blademaster
3 / / 20.08.2007
Я новичек в программировании.
Есть программа на Borland C++: к com-порту подключается устройство(не важно какое именно), и с помощью программы на один из выводов порта посылается логическая 1 или 0; все это происходит с определенным промежутком времени, которое определяется из текстового файла. Кроме того в этот же файл во время работы программы записывается текущаая дата и время, а также время, прошедшее с начала работы.
Программа работает в досе.
Так вот, когда программа работает, то процессор грузится на 99 %.
Почему так происходит и можно ли уменьшить загрузку процессора?
2.9K
20 августа 2007 года
Ation
96 / / 27.07.2004
Как правило, такую загрузку процессора дает цикл. Перепроверь, правильно ли определяються временные интервалы и выполняеться ли ожидание.
А еще лучше приведи текст программы, т.к. скил экстрасенса мало у кого прокачан, чтоб ответить тебе.
п.с. я хочу кушать, а на работу добираюсь автобусом(неважно каким). В обед поел, а окно заклинило, не знаешь почему и как с этим бороться?
31K
20 августа 2007 года
blademaster
3 / / 20.08.2007
Код:
#include <fstream.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>
#include <stdio.h>

int bap=0x03FC; //базовый адрес регистра порта
unsigned int t; //время

//функция вывода логической 1 (+15 В)
void logic1()
{
   cout<<"Writing logical 1 to com\n\n...\n"<<endl;
   outportb(bap, 1);
   clreol();
}

//функция вывода логического 0 (-15 В)
void logic0()
{
   cout<<"Writing logical 0 to com\n\n...\n"<<endl;
   outportb(bap, 0);
}

//функция получения из файла time.txt значения времени t
void time()
{
   fstream timefile;
   timefile.open("time.txt",ios::in);
   //запись времени t в сек в программу из файла
   timefile>>t;
   timefile.close();
}

//функция для вывода меню
void menu()
{
   cout<<"Select operation:"<<endl;
   cout<<"press '1' to write logical 1/0 to com"<<endl;
   cout<<"press '9' to exit"<<endl;
   cout<<"\nVremya (sec) t = "<<t<<"\n"<<endl;
}

main()
{
  time();
  menu();
  while(1)
  {
    switch(getch())
    {
      case '1':
        while(!kbhit())
        {
          //запись логической 1 (+15 В)
          logic1();
          for(unsigned int d=1;d<=t;d++)
          {
            cout<<"proshlo vremeni (sec): "<<d<<endl;
            delay(1000);

            //запись в файл time.txt текущей даты и времени и
            //прошедшего с начала времени в сек
            fstream timefile;
            timefile.open("time.txt",ios::out);

            struct time timet;
            struct dosdate_t dost;

            gettime(&timet);
            _dos_getdate(&dost);

            printf("%02d.%02d.%02d  %02d:%02d:%02d\n",
                      dost.day, dost.month, dost.year,
                      timet.ti_hour, timet.ti_min, timet.ti_sec);

            unsigned int day=dost.day;
            unsigned int month=dost.month;
            unsigned int year=dost.year;
            unsigned int hour=timet.ti_hour;
            unsigned int min=timet.ti_min;
            unsigned int sec=timet.ti_sec;

            //если число меньше 10, ставим перед цифрой 0.
            timefile<<"время (сек): "<<t<<"\n\nтекущая дата и время:";
            if(dost.day<=9){timefile<<"\n"<<"0"<<day;}
            else {timefile<<"\n"<<day;}
            if(dost.month<=9){timefile<<"."<<"0"<<month;}
            else {timefile<<t<<"."<<month;}
            timefile<<"."<<year;
            if(timet.ti_hour<=9){timefile<<"  "<<"0"<<hour;}
            else {timefile<<"  "<<hour;}
            if(timet.ti_min<=9){timefile<<":"<<"0"<<min;}
            else {timefile<<":"<<min;}
            if(timet.ti_sec<=9){timefile<<":"<<"0"<<sec;}
            else {timefile<<":"<<sec;}

            timefile<<"\n\nработа\nпрошло времени (сек): "<<d<<endl;

            //если нажали клавишу, то возврат в меню
            cout<<"\npress any key to stop writing"<<endl;
            if(kbhit()) {goto M;}
          }
          clreol();
          //запись логического 0
          logic0();
          for(unsigned int d=1;d<=t;d++)
          {
            cout<<"proshlo vremeni (sec): "<<d<<endl;
            delay(1000);

            //запись в файл time.txt текущей даты и времени и
            //прошедшего с начала времени в сек
            fstream timefile;
            timefile.open("time.txt",ios::out);

            struct time timet;
            struct dosdate_t dost;

            gettime(&timet);
            _dos_getdate(&dost);

            printf("%02d.%02d.%02d  %02d:%02d:%02d\n",
                    dost.day, dost.month, dost.year,
                    timet.ti_hour, timet.ti_min, timet.ti_sec);

            unsigned int day=dost.day;
            unsigned int month=dost.month;
            unsigned int year=dost.year;
            unsigned int hour=timet.ti_hour;
            unsigned int min=timet.ti_min;
            unsigned int sec=timet.ti_sec;

            //если число меньше 10, ставим перед цифрой 0.
            timefile<<"время (сек): "<<t<<"\n\nтекущая дата и время:";
            if(dost.day<=9){timefile<<"\n"<<"0"<<day;}
            else {timefile<<"\n"<<day;}
            if(dost.month<=9){timefile<<"."<<"0"<<month;}
            else {timefile<<t<<"."<<month;}
            timefile<<"."<<year;
            if(timet.ti_hour<=9){timefile<<"  "<<"0"<<hour;}
            else {timefile<<"  "<<hour;}
            if(timet.ti_min<=9){timefile<<":"<<"0"<<min;}
            else {timefile<<":"<<min;}
            if(timet.ti_sec<=9){timefile<<":"<<"0"<<sec;}
            else {timefile<<":"<<sec;}

            timefile<<"\n\nстоп\nпрошло времени (сек): "<<d<<endl;

            //если нажали клавишу, то возврат в меню
            cout<<"\npress any key to stop writing"<<endl;
            if(kbhit()) {goto M;}

            //запись логического 0 (-15 В)
          }
        }
        M:
          clrscr(); //очистка экрана
          menu(); //вывод меню
          break;
        case '9':
          exit(0);
          break;
    }
  }
}
276
20 августа 2007 года
Rebbit
1.1K / / 01.08.2005
Сделаем такую програмку
Код:
#include <stdio.h>;
#include <dos.h>
#include <iostream.h>

void main() {
  int i;
  for (i = 0; i < 10; ++i){
    delay(5000);
    cout << i;;
  }
}

И задежки выполняются и не делает ничево, а процесор загружен :).
Дело в delay. Если тебе надо снять нагрузку с процессора можно попробовать перехватывать преривание таймера. Одним словом, проблему я показал, а как с етим бороться возможно потскажут люди которые умнее меня.
8.9K
21 августа 2007 года
Kulti
77 / / 29.07.2006
Не очень понятно, что ты хочешь. Но если тебе надо с ком-портом работать то какие-то методы у тебя старнные. Вот здесь про все регистры расписано, но зачем тебе на таком низком уровне работать, ты же не на асме пишешь?Сюда сходи
240
21 августа 2007 года
aks
2.5K / / 14.07.2006
делай sleep/Sleep потоку. )
31K
21 августа 2007 года
blademaster
3 / / 20.08.2007
Всем спасибо за советы/пожелания.
разобрался ч0 к чему.
20K
27 августа 2007 года
sja
22 / / 08.01.2007
подгрузи файл windows.h
и сделай в коде Sleep(1);
и прога не заметит - и проц будет 0% кушать - это уже пройденный этап.
а в дельфях и борланд сях - чтото типа ProcessMessages() надо сделать!
240
27 августа 2007 года
aks
2.5K / / 14.07.2006
Цитата: sja

а в дельфях и борланд сях - чтото типа ProcessMessages() надо сделать!


Бугага ))

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог