Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > программа жрет ресурсы


Автор: Albles 14.1.2010, 15:35
Подскажите, пожалуйста кто знает - почему программа может жрать ресурсы - загрузка процессора 90-99%. Все начинает тормозить.

Код

__fastcall Potok::Potok(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall Potok::Execute()
{
while(!Terminated)
    {
     Com_port();
     }
}
void __fastcall Potok::Com_port()
{
здесь код потока
}


В потоке обмениваюсь с микроконтроллером через сом-порт. Чем дольше время выполнения этого кода потока, тем больше все тормозит.

Автор: Alca 14.1.2010, 15:36
Код

void __fastcall Potok::Com_port()
{
    //?????????????
}


Добавлено через 59 секунд
А если в Com_port() ::Sleep(N) впихнуть?

Автор: Albles 14.1.2010, 15:47
А что это даст? Мне нужно, чтобы обновление данных с контроллера происходило максимально быстро.

Автор: Alca 14.1.2010, 15:53
Цитата

А что это даст?

будет меньше проц грузиться

Цитата

почему программа может жрать ресурсы

Цитата

А что это даст? Мне нужно, чтобы обновление данных с контроллера происходило максимально быстро.

Ты определись, что тебе надо

Автор: Alexeis 14.1.2010, 15:53
Цитата(Alca @  14.1.2010,  14:36 Найти цитируемый пост)
А если в Com_port() ::Sleep(N) впихнуть? 

  А еще лучше усыпить поток только на время отсутствия операций. Например при помощи WaitForSingleObject .
Вообще вариантов просто куча см. http://msdn.microsoft.com/en-us/library/ms810467.aspx

Добавлено через 2 минуты и 55 секунд
Цитата(Alca @  14.1.2010,  14:53 Найти цитируемый пост)
Ты определись, что тебе надо

Можно иметь и то и другое. Винда по прерыванию от компорта переключает евент, ос проверяет его состояние и будит поток насколько быстро насколько может. Тем быстрее чем выше приоритет потока.

Автор: Alca 14.1.2010, 15:57
Цитата

Overlapped I/O

Overlapped I/O is not as straightforward as nonoverlapped I/O, but allows more flexibility and efficiency.


Добавлено через 43 секунды
Код

void __fastcall Potok::Com_port()
{

     smile 
Код

}

Автор: mrbrooks 14.1.2010, 15:57
Цитата(Albles @  14.1.2010,  15:35 Найти цитируемый пост)
Чем дольше время выполнения этого кода потока, тем больше все тормозит. 

было бы интересно оценить код опроса самого порта.

Автор: Albles 14.1.2010, 15:59
спасибо, буду пробовать

Автор: Alca 14.1.2010, 15:59
Цитата

было бы интересно оценить код опроса самого порта.

стопудово вертушка

Автор: Alexeis 14.1.2010, 16:01
Alca, что ты хочешь сказать этой цитатой? Не сказано, что быстродействие хуже. Говориться лишь что работа в режиме Overlapped сложнее, но гибче и эффективнее. 

Автор: Alca 14.1.2010, 16:07
Alexeis, ты сам перевел, то что я хотел сказать.  smile 

Автор: Albles 14.1.2010, 16:08
да код большой - там много других операций по обработке принимаемых данных,  а подпрограмма запрос-чтение такая:

Код

//=============================================================
//--------- ÇÀÏÈÑÜ ÄÀÍÍÛÕ Â ÏÎÐÒ, ÏÀÓÇÀ È ×ÒÅÍÈÅ -----------------------------
//=============================================================
int __fastcall Write_Port(HANDLE handle,
                          char *buf_wr,
                          char *buf_rd,
                          int num_bwr,
                          int num_brd)
{
BOOL fSuccess;
DWORD ByteCount;

  OVERLAPPED o;
  o.Internal    =0;
  o.InternalHigh=0;
  o.Offset      =0;
  o.OffsetHigh  =0;
  o.hEvent=CreateEvent(NULL,false,false,NULL);

PurgeComm(handle,PURGE_TXCLEAR|PURGE_RXCLEAR); // Î÷èñòêà î÷åðåäåé ïðèåìà è ïåðåäà÷è â äðàéâåðå

fSuccess =WriteFile(handle,buf_wr,num_bwr,&ByteCount,&o);
   if (!fSuccess)
   {
     ShowMessage("Îøèáêà çàïèñè â ïîðò");
      return(0);
   }
//--- ïàóçà
if (buf_wr[1] == 0x10) Delay (num_bwr/4+10); // 10ìñ íà çàïèñü ôëýø
else Delay(num_bwr/4);  // ïàóçà = çàïðîñ

//--- ÷òåíèå
COMSTAT  stat;
DWORD    err;

ByteCount=0;

for(int i=0;i<30;i++)
  {
      ClearCommError(handle,&err,&stat);
//      if(stat.cbInQue>0)
      if(stat.cbInQue==num_brd)// â áóôåðå ââîäà ïðèíÿòû âñå áàéòû?
        { fSuccess =ReadFile(handle,buf_rd,num_brd,&ByteCount,&o); // ÷èòàåì áóôåð
          break; }
      else   Delay (1);
  }

//--- çàâåðøåíèå

CloseHandle(o.hEvent);  // Çàêðûòü ñîáûòèÿ
return ((int) ByteCount);
}
//------ Îêîí÷àíèå -------------------------------------------


Автор: Albles 14.1.2010, 16:46
заменил свои Delay на Sleep и помогло, Спасибо!

Автор: Alca 14.1.2010, 17:05
А че у тебя за Delay было?

Добавлено через 5 минут и 12 секунд
Вместо слипа лучше юзать Event + WaitForSingleObject - меньше грузит проц.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)