Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Thread'ы в процессах, CPU Usage = 98% ??? Почему так много? 
:(
    Опции темы
bel_nikita
Дата 27.10.2004, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 4
Всего: 47



Есть программа, в ней создаю нитку(thread). А в нем типа вечный двигатель( while (true){ tra-la-la; WaitForSingleObject; tra-la-la } ) После этого мой тред сжирает 95-98% процессорного времени. Как от этого избавлятся?


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Adil'
Дата 27.10.2004, 09:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 2
Всего: 15



В принципе, использование WaitForSingleObject не должно приводить к этому. Покажешь, что внутри while?


--------------------
Удачи
PM MAIL WWW   Вверх
Step
Дата 27.10.2004, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: нет
Всего: 25



во первых какая нить интерфейсная или рабочая... второй параметр у WaitForSingleObject какой

вообще код весь привиди... весь цикл


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
bel_nikita
Дата 27.10.2004, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 4
Всего: 47



у меня там com-port юзается, и я думаю проблема в WaitCommEvent

Вот вырезка с кода, но я думаю он мало чем поможет:
Код
/************************************************************************/
/* FUNCTION    : Loop()                                                 */
/* OBJECT      : cBarCode                                               */
/* PURPOSE     : thread com port process                                */
/* PARAMETERS  : none                                                   */
/* RETURN VALUE: none                                                   */
/* COMMENT     : none                                                   */
/************************************************************************/
void cBarCode::Loop()
{
 while(!_isDying)
 {
   {
     Process();
   }
 }
}

/************************************************************************/
/* FUNCTION    : Process()                                              */
/* OBJECT      : cBarCode                                               */
/* PURPOSE     : com port process                                       */
/* PARAMETERS  : none                                                   */
/* RETURN VALUE: none                                                   */
/* COMMENT     : none                                                   */
/************************************************************************/
void cBarCode::Process()
{
 DWORD dwRes = 0;
 DWORD dwOvRes = 0;
 DWORD dwCommModemStatus = 0;

    if( !fWaitingOnStat && !WaitCommEvent(m_hPort, &dwCommModemStatus, &m_evStatus) )
   {
     if(GetLastError() == ERROR_IO_PENDING)
       fWaitingOnStat = TRUE;
     else
     {
       Event(dwCommModemStatus); // read from com
     }
   }
   if (fWaitingOnStat)
   {
     dwRes = WaitForSingleObject(m_evStatus.hEvent, 500);
     if(dwRes==WAIT_OBJECT_0)
     {            
       // Event occurred.
       if (GetOverlappedResult(m_hPort, &m_evStatus, &dwOvRes, FALSE))
         Event(dwCommModemStatus); // read from com
       fWaitingOnStat = FALSE;
     }
   }
   SetCommMask (m_hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RING);
   GetCommModemStatus (m_hPort, &dwCommModemStatus);

}




--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
Step
Дата 27.10.2004, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5151
Регистрация: 26.9.2002
Где: дурдом.UA

Репутация: нет
Всего: 25



подозреваю что это условие выполняеться очень редко
if (fWaitingOnStat)



вот это странно
if(GetLastError() == ERROR_IO_PENDING)
fWaitingOnStat = TRUE;
може false


--------------------
- Дурак учится на своих ошибках, умный на чужих.
 - умные учатся у дураков
PM MAIL ICQ   Вверх
Monomah
Дата 27.10.2004, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 30.9.2004

Репутация: нет
Всего: нет



Поставь где-нибудь в цикле Sleep(1)
PM MAIL   Вверх
Adil'
Дата 27.10.2004, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 26.8.2004
Где: Питер

Репутация: 2
Всего: 15



bel_nikita, подозрительно то, что первый вызов Event(dwCommModemStatus); // read from com
будет отрабатывать тогда, когда WaitCommEvent вернет ошибку. Скорее надо наоборот - когда ошибки нет:
Код
 if( !fWaitingOnStat && !WaitCommEvent(m_hPort, &dwCommModemStatus, &m_evStatus) )
 {
   if(GetLastError() == ERROR_IO_PENDING)
     fWaitingOnStat = TRUE;
   //else
       //здесь можно вызвать ClearCommError
 }
 else if(!fWaitingOnStat)
 {
  Event(dwCommModemStatus); // read from com
 }
 ...

SetCommMask (m_hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RING); можно смело вынести в Loop() перед while, а GetCommModemStatus, если вообще нужна, логичнее было бы вызывать внутри Event();

З.Ы. а может проще было обойтесь без флага fWaitingOnStat:
Код
void cBarCode::Process()
{
DWORD dwRes = 0;
DWORD dwOvRes = 0;
DWORD dwEvtMask = 0;
 if(WaitCommEvent(m_hPort, &dwEvtMask, &m_evStatus) ||
     ( (GetLastError() == ERROR_IO_PENDING  /*|| ClearCommError(m_hPort,&EvtMask,NULL)*/) &&
       (WaitForSingleObject(m_evStatus.hEvent, 500)==WAIT_OBJECT_0) &&
        GetOverlappedResult(m_hPort, &m_evStatus, &dwOvRes, FALSE)
     )
   )
   Event(dwEvtMask); // read from com
}









--------------------
Удачи
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.5120 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.