Вопрос о потоках.
От: Аноним  
Дата: 27.12.07 10:31
Оценка:
Добрый день! Подскажите пожалуйста, вот есть такой простой "поток"
DWORD WINAPI ThreadProc(LPVOID indata)
{                            
        
    DWORD  dwBytesReturned;
        LOGBUF LogBuf;
            
                
    while( gl_fbExitNow==FALSE )
        {
           
          //DeviceIoControl(hDevice, IOCTL_GETLOG, NULL, 0, &LogBuf, sizeof(LOGBUF), &dwBytesReturned, NULL);
  
          printf("get log \n");
          Sleep(2000);
    
    }
        printf("exit get log \n");
    printf( "#: " );
    return 0;
    }


И грузит он процессор напару с csrss.exe на 100%, хотя по МСДН должно получится, что поток будет не работать
( Sleep(2000) ) 2 сек. Почему же тогда грузится так процессор?
Re: Вопрос о потоках.
От: lapslap  
Дата: 27.12.07 12:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>И грузит он процессор напару с csrss.exe на 100%, хотя по МСДН должно получится, что поток будет не работать

А>( Sleep(2000) ) 2 сек. Почему же тогда грузится так процессор?

в вашем случае немогу сказать почему может быть 100%
лишь скажу что лучше использовать для ожидания WaitForSingleObject например.
Re[2]: Вопрос о потоках.
От: Аноним  
Дата: 27.12.07 12:30
Оценка:
Здравствуйте, lapslap, Вы писали:
L>в вашем случае немогу сказать почему может быть 100%
L>лишь скажу что лучше использовать для ожидания WaitForSingleObject например.

А на каком объекте мне ждать WaitForSingleObject-ом, неужели на хендле самого этого потока?
Re[3]: Вопрос о потоках.
От: Аноним  
Дата: 27.12.07 12:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, lapslap, Вы писали:

L>>в вашем случае немогу сказать почему может быть 100%
L>>лишь скажу что лучше использовать для ожидания WaitForSingleObject например.

А>А на каком объекте мне ждать WaitForSingleObject-ом, неужели на хендле самого этого потока?


Не помогает, теже 100% загрузки проца. Ну как так, поток должен спать, а какбудто он всем процессором
на пару с Виндой считает эти милисикунды, чтоб не просрочить свое просыпание.
Re: Вопрос о потоках.
От: Michael Chelnokov Украина  
Дата: 27.12.07 12:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>И грузит он процессор напару с csrss.exe на 100%,


Вы уверены что грузит *именно этот* поток?
Re[2]: Вопрос о потоках.
От: Аноним  
Дата: 27.12.07 13:21
Оценка: :)
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Здравствуйте, Аноним, Вы писали:


А>>И грузит он процессор напару с csrss.exe на 100%,


MC>Вы уверены что грузит *именно этот* поток?


Вот нравятся мне такие советы, хотел уже весь код выложить, мол все просто
в проге. Бегло просмотрел и на тебе, вот оно глючное место.
В "главной" программе есть вот такое

gl_hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
        
while( !_kbhit() )
{

}

gl_fbExitNow=TRUE;


Вместо

gl_hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
        
while( !_kbhit() )
{
     WaitForSingleObject(gl_hThread, INFINITE);
}

gl_fbExitNow=TRUE;


Благодарствую!
Re[3]: Вопрос о потоках.
От: Аноним  
Дата: 27.12.07 14:13
Оценка:
А лучше например так:
while( !_kbhit() )
{
     WaitForSingleObject(gl_hThread, 1000);
}

gl_fbExitNow=TRUE;


а то поток так и не отдаст управление собой
Re[3]: Вопрос о потоках.
От: Michael Chelnokov Украина  
Дата: 27.12.07 18:58
Оценка: 9 (2)
Здравствуйте, Аноним, Вы писали:

А>Вот нравятся мне такие советы, хотел уже весь код выложить, мол все просто

А>в проге. Бегло просмотрел и на тебе, вот оно глючное место.

Да просто методом исключения. Sleep поток не останавливает? С чего бы это? Ладно бы SleepEx(N, TRUE), и кто-то APC сует этому потоку постоянно, так нет, обычный Sleep. Да и ты бы скорее всего упомянул что "get log" выводит с бешеной скоростью. Остается printf. Уж не знаю, что такое можно сделать, чтобы printf внутри себя зациклился. Даже если ты вызываешь CreateThread, а не _beginthreadex. Отсюда вывод — скорее всего зацикливается не в этом потоке.
Re[4]: Вопрос о потоках.
От: Michael Chelnokov Украина  
Дата: 27.12.07 19:04
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Да и ты бы скорее всего упомянул что "get log" выводит с бешеной скоростью.


Плюс 100% CPU при этом бы не получилось, все-таки блокирующий вывод.
Re[4]: Вопрос о потоках.
От: oziro Нигерия  
Дата: 27.12.07 19:37
Оценка:
Здравствуйте, Michael Chelnokov, Вы писали:

MC>Да просто методом исключения.


Вы просто мой кумир
И не лень же писать и отвечать в очередной раз о всяких "пакетах в TCP"
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.