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

Ваш аккаунт

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

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

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

Поток съедает все ресурсы...

299
23 августа 2005 года
3D Bob
885 / / 18.04.2005
В простом проекте билдера(то есть уже с встроенно созданной формой), в конструкторе класса TForm1
Создаю потом (примерно это так).
 
Код:
__fastcall TFormMain::TFormMain(TComponent* Owner)
        : TForm(Owner)
{
UsersThread = CreateThread(NULL,NULL,&OnLineUsers,NULL,CREATE_SUSPENDED,NULL);
ResumeThread(UsersThread);
SetThreadPriority(UsersThread, THREAD_PRIORITY_NORMAL);
}


И соответсвенно
 
Код:
DWORD WINAPI OnLineUsers(LPVOID lpParameter){
        while(1){
        }
}

Так вот. Поток загружает проц по полной:(
310
23 августа 2005 года
fellow
853 / / 17.03.2003
А чего, собственно, ты ожидал? Так и должно быть, при твоём то бесконечном пустом цикле.

Вставь в цикл ::Sleep(0), чтобы отдать остаток кванта времени другому потоку с одинаковым приоритетом. Подробности, как всегда, в MSDN.
299
23 августа 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by fellow
А чего, собственно, ты ожидал? Так и должно быть, при твоём то бесконечном пустом цикле.

Вставь в цикл ::Sleep(0), чтобы отдать остаток кванта времени другому потоку с одинаковым приоритетом. Подробности, как всегда, в MSDN.


Я предполагал, что винда дает этому бесконечному циклу определенное время на выполнение, а потом передает управление следующему. И после того как все приложения обработаются, вернет управелние моему циклу. Тем самым лаги будут не особо заметны.
Это разве правильно, что я сам устанавливаю время, когда процессу сново начать действовать? Я думал этим должна заниматься винда.

310
23 августа 2005 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by 3D Bob
Я предполагал, что винда дает этому бесконечному циклу определенное время на выполнение, а потом передает управление следующему. И не после того как все приложения обработаются, вернет управелние моему циклу.



В общем верно. Есть некоторые тонкости, но в целом верно. Что не мешает 100% загружать процессор во время выполнения бесконечного пустого цикла.

Кроме того, так называемую загрузку процессора ты, наверное, наблюдаешь по графику на вкладке "Быстродействие" в Диспетчере задач? Так не беспокойся зря. Во-первых, это не настоящая загрузка, во-вторых, не настоящего процессора. :)

А ::Sleep(0) вставь. Это полезно.

299
23 августа 2005 года
3D Bob
885 / / 18.04.2005
Цитата:
Originally posted by fellow
В общем верно. Есть некоторые тонкости, но в целом верно. Что не мешает 100% загружать процессор во время выполнения бесконечного пустого цикла.

Кроме того, так называемую загрузку процессора ты, наверное, наблюдаешь по графику на вкладке "Быстродействие" в Диспетчере задач? Так не беспокойся зря. Во-первых, это не настоящая загрузка, во-вторых, не настоящего процессора. :)

А ::Sleep(0) вставь. Это полезно.



Под загрузкой процессора я понимаю безумные лаги, от моего потока:((((
Хотя насколько я понимаю есть у потока приоритет должен стоятть низкий, то он милисекунду выполняется и вообще на быстродействие должен практически не влиять. А я выставлял даже самый низкий и все равно:(
Просто, если раньше я что-то понимал, то теперь я вообще в ступоре, что такое приоритет....
Я теперь вообще не понимаю,Ю нафига приоритеты, если мы сами пишим Sleep();
После прошествия временя я всегда думал этот слип сам срабатывать должен.

299
23 августа 2005 года
3D Bob
885 / / 18.04.2005
И еще я не понимаю. Почему вот такая программа
Код:
#include <windows.h>
int WINAPI WinMain(HINSTANCE HInstance,HINSTANCE hPrevInstance,LPSTR nCmdLine,int nCmdShow)
{

HWND wnd;

MSG msg;


while(GetMessage(&msg,wnd,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
return 0;
}

В диспечере задач пишит, что проц загружен на стопроцентов. А у других программ такого нет.
Как же они тогда получают сообщения, если совершенно не грузят процессор.

И как тогда создать прогу следяющая за временем, и обабатывающая какой-нить код только по прошествии этого определенного времени, чтобы Диспечер задач не писал загруженность компа 100%.
310
23 августа 2005 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by 3D Bob
Под загрузкой процессора я понимаю безумные лаги, от моего потока:((((
Хотя насколько я понимаю есть у потока приоритет должен стоятть низкий, то он милисекунду выполняется и вообще на быстродействие должен практически не влиять. А я выставлял даже самый низкий и все равно:(
Просто, если раньше я что-то понимал, то теперь я вообще в ступоре, что такое приоритет....
Я теперь вообще не понимаю,Ю нафига приоритеты, если мы сами пишим Sleep();
После прошествия временя я всегда думал этот слип сам срабатывать должен.



Время потокам выделяется квантами, размер кванта фиксирован. Если даже поток имеет низкий уровень приоритета, то он всё равно получит полноценный квант, когда придёт его очередь.

На очередь получения кванта, кроме уровней приоритета процесса и приоритета потока, влияет ещё динамическое изменение уровня приоритета и т.д. В MSDN написано достаточно подробно про это.

Sleep(0) отдаёт остаток процессорного времени потока системе, только и всего. Т.е. это путь "джентльмена от потоков": делать нечего - нефиг время занимать :) "Неджентльмены" как заграбастуют себе всё время целиком, так и сидят сиднем, ни себе, ни людям :)

Что касается "лагов", то, может быть, намудрил ты где-то, т.к. никаких "лагов", заметных по крайней мере, быть не должно.

310
23 августа 2005 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by 3D Bob
И еще я не понимаю. Почему вот такая программа
Код:
#include <windows.h>
int WINAPI WinMain(HINSTANCE HInstance,HINSTANCE hPrevInstance,LPSTR nCmdLine,int nCmdShow)
{

HWND wnd;

MSG msg;


while(GetMessage(&msg,wnd,0,0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}
return 0;
}

В диспечере задач пишит, что проц загружен на стопроцентов. А у других программ такого нет.
Как же они тогда получают сообщения, если совершенно не грузят процессор.

И как тогда создать прогу следяющая за временем, и обабатывающая какой-нить код только по прошествии этого определенного времени, чтобы Диспечер задач не писал загруженность компа 100%.



А потому, что нет оконной функции, и GetMessage, вместо того, чтобы нормальным образом остановить выполнение цикла до получения сообщения, постоянно вываливается с результатом -1, как и написано в справке. В нормальной программе есть оконная функция, есть зарегистрированный класс окна, есть кому обрабатывать сообщения, есть и сами сообщения. В том огрызке, что ты привёл, ничего нет. У тебя каждая функция заканчивается крахом, а цикл молотит и молотит себе :)

299
24 августа 2005 года
3D Bob
885 / / 18.04.2005
Огромное спасибо!
299
24 августа 2005 года
3D Bob
885 / / 18.04.2005
MSDN для меня пока что не очень удобно.
Скачал Рихтера, буду изучать)
310
24 августа 2005 года
fellow
853 / / 17.03.2003
Цитата:
Originally posted by 3D Bob
MSDN для меня пока что не очень удобно.
Скачал Рихтера, буду изучать)


Тоже неплохо! Удачи! :)

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