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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Свой микропланировщик, выполнение потоков с разным приоритетами 
:(
    Опции темы
IGanja
Дата 28.3.2012, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пишу планировщик, который должен с заданной частотой запускать потоки. Потока два, основной поток процесса и бэкграунд поток. 
Задача раз в такт планировщика запускать одну итерацию основного поток, по завершению итерации оставшееся время такта отдавать бэкграунду. В следующий такт работа бэкграунда приостанавливается и запускается следующая итерация основного потока и так далее.

Принудительно устанавливаю выполнение процесса на конкретное ядро, чтобы потоки не выполнялись на разных ядрах, далее основному потоку ставлю приоритет Highest, бэкграунд потоку Idle. Устанавливаю ожидаемый таймер с автосбросом и запускаю.

Получаю совсем не то что хочу, в лучшем случае бэкграунд всегда успевает выполнится до конца, в худшем оба потока почему то начинают работать вместе. 

Почему бэкграунд не вытесняется более приоритетным потоком?

Ниже приведен код программы.
Код

#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <iostream>
using namespace std;

int FREQUENCY = 100; //Гц

void func(void)
{
        cout<<"main 1"<<endl;
        cout<<"main 2"<<endl;
        cout<<"main 3"<<endl;
        cout<<"main 4"<<endl;
        cout<<"main 5"<<endl;
        cout<<"main 6"<<endl;
        cout<<"main 7"<<endl;
        cout<<"main 8"<<endl;
        cout<<"main 9"<<endl;
        cout<<"main 10"<<endl;
}

DWORD WINAPI background_thread(PVOID pvParam)
{
    while(true)
    {
        Sleep(10);
        cout<<"bckgrnd 1"<<endl;
        cout<<"bckgrnd 2"<<endl;
        cout<<"bckgrnd 3"<<endl;
        cout<<"bckgrnd 4"<<endl;
        cout<<"bckgrnd 5"<<endl;
        cout<<"bckgrnd 6"<<endl;
        cout<<"bckgrnd 7"<<endl;
        cout<<"bckgrnd 8"<<endl;
        cout<<"bckgrnd 9"<<endl;
        cout<<"bckgrnd 10"<<endl;
    }
    return 0;
}

void main(void)
{
    int iter = 0;
    LARGE_INTEGER firstStart;
    const int unitPerSecond = 10000000;
    int freq_ms = 1000/FREQUENCY; //msec
    DWORD dwThreadId;

    HANDLE hBackgrnd = CreateThread(NULL, 0, background_thread, NULL, 0, &dwThreadId);// создание потока backgrnd

    SetPriorityClass(GetCurrentProcess(),HIGH_PRIORITY_CLASS); // установка приоритета процесса
    SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST); // установка приоритета главного потока
    SetThreadPriority(hBackgrnd,THREAD_PRIORITY_IDLE); // установка приоритета background потока
    SetProcessAffinityMask(GetCurrentProcess(),1); // установка TASKa на конкретное ядро процессора

    // создание и настройка таймера
    firstStart.QuadPart = -(1*unitPerSecond);
    HANDLE hTimer = CreateWaitableTimer(NULL, FALSE, NULL); // таймер с автосбросом
    SetWaitableTimer(hTimer, &firstStart, freq_ms, NULL, NULL, FALSE); // настройка

    while(iter<2)
    {
        func();
        iter++;
        WaitForSingleObject(hTimer, INFINITE); // жду следующего кванта
    }
}



Это сообщение отредактировал(а) IGanja - 28.3.2012, 10:00
PM MAIL   Вверх
Dem_max
Дата 28.3.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

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



Цитата

Получаю совсем не то что хочу, в лучшем случае бэкграунд всегда успевает выполнится до конца,

Ты первым делом поток запустил и он тут же выполнился, потом только выполнилась func(). Все правильно.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
GremlinProg
Дата 28.3.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(IGanja @  28.3.2012,  11:50 Найти цитируемый пост)
Получаю совсем не то что хочу, в лучшем случае бэкграунд всегда успевает выполнится до конца, в худшем оба потока почему то начинают работать вместе. Почему бэкграунд не вытесняется более приоритетным потоком?

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

не надо понимать документацию так буквально

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

Это сообщение отредактировал(а) GremlinProg - 28.3.2012, 11:45


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
IGanja
Дата 29.3.2012, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо за помощь, решение нашел с помощью функций
SuspendThread(hBackgrnd);
ResumeThread(hBackgrnd);
обрамив ими задачу основного потока
Код

while(iter<2)
{
   SuspendThread(hBackgrnd);
   func();
   iter++;
   ResumeThread(hBackgrnd);
   WaitForSingleObject(hTimer, INFINITE); // жду следующего кванта
}



Это сообщение отредактировал(а) IGanja - 29.3.2012, 18:42
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0641 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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