Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > функция потока, выполняемая без передачи управлени


Автор: Andrey88 28.11.2006, 16:17
Вобщем я должен написать функцию потока, в которой будут два следующих нехитрых действия:

1) считать число
2) по результатам считанного числа выдать другое число

Физически есть коробка с "демоном" внутри. Демон каждый n милисекунд меняет счётчик. Т.е. на цифирблате устройства меняется номер ячейки для отображения - и я должен успеть на нужную ячейку подать нужные данные. Но на практике столкнулся с тем, что выполнение прерывается посередине, и данные выводятся на следующую ячейку.

Посоветуйте чего можно сделать плиzzz!

Пока есть только вариант менять приретет потока - до начала выполнения поставить большой, а после сделать обратно нормальным.

Автор: RatHat 28.11.2006, 19:54
Код показывай - будем думать: проще посмотреть, где ошибка, чем придумывать с нуля.
Да и тебе проще понять будет.

Автор: Andrey88 30.11.2006, 17:13
Извиняюсь за задержку. Устройство КАМАК.

    /** Функция потока, реализует основную функциональность класса
    * @param pObj - в качестве указателя передаётся указатель на объект запустивший поток
    * @return 0 в случае успеха, иначе код ошибки
    */
DWORD WINAPI ThreadFunc(void* pointer){

    TBridge bridge(0x382,0x380,0x384,4); // существующий класс для работы с Камаком
    COutputRegistry OReg(&bridge);// мои классы
    OReg.Chop();
    CInputRegistry IReg(&bridge);    
    SYSTEMTIME st;
    SYSTEMTIME AlarmTime;
    int delta;
    bool bAlarm;     // будильник включён физически
    bool bAlarmTime; // наступило время срабатывания будильника
    bool bIndicate;  // надо показать время срабатывания будильника

    int res; // переменная для хранения возвращаемого кода ошибки

    int data;

    while(1){

        SetPriorityClass(GetCurrentThread(),REALTIME_PRIORITY_CLASS);

        // получаем данные от камака
        if((res=IReg.GetData(data)))return res; 
        // получаем текущее время        
        GetSystemTime(&st);

        OReg.WriteData(4,0,CClock::DataConvert(data,st,FALSE));

        SetPriorityClass(GetCurrentThread(),NORMAL_PRIORITY_CLASS);        
    }
    return 0;
}

вот и вся функция потока - нужно то, что в While сделать непрерывно выполняемым...
Вызываются написанные мной функции, которые работают с железякой...

Автор: dumb 30.11.2006, 18:27
Код

void main()
{
  // это турбо-зло включать, если все равно не "попадаешь"
  //SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
  CreateThread(..., ThreadFunc, ...);
  ...
}

DWORD WINAPI ThreadFunc(void* pointer){
  ...
  SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
  while(1){
        // получаем данные от камака
        if((res=IReg.GetData(data)))return res; 
        // получаем текущее время        
        GetSystemTime(&st);

        OReg.WriteData(4,0,CClock::DataConvert(data,st,FALSE));
     Sleep(10); // сливаем, чтоб остальные проги могли пошевельнуться... 10 - от балды, тебе там видней будет
  }
  return 0;
}


а вообще, такие штуки надо в rtos делать... smile

Автор: Andrey88 30.11.2006, 18:48
Спасибо!!!
А в моём варианте наверно много ресурсов будт уходить на изменение приорететов...

А как это надо в идеале делать? В смысле что за слово или абривиатура такая?
real time os???

Автор: dumb 30.11.2006, 20:47
Цитата(Andrey88 @  30.11.2006,  18:48 Найти цитируемый пост)
А в моём варианте наверно много ресурсов будт уходить на изменение приорететов...

у тебя получается от
Код

SetPriorityClass(GetCurrentThread(),NORMAL_PRIORITY_CLASS);

до
Код

SetPriorityClass(GetCurrentThread(),REALTIME_PRIORITY_CLASS);

- один jmp smile

и кстати, это вообще нерабочий код - функция для установки приоритета процесса, а псевдо-хэндл берешь от потока...

Цитата(Andrey88 @  30.11.2006,  18:48 Найти цитируемый пост)
real time os???

да. то бишь не виндоус ни разу.

Добавлено @ 20:51 
поправочка к последней фразе: для виндузы вроде как ядра альтернативные существуют...

Автор: Andrey88 30.11.2006, 20:55
Спасибо!

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

Автор: takedo 8.12.2006, 09:37
так, если не успевает отрисоваться, то сделай отрисовку  в обработчике сообщения WM__ТВОЕСООБЩЕНИЕНАОТРИСОВКУ. А из своего потока шли в окно где отрисовываешь сообщение по SendMessage. Этим гарантированно добьешся того, что сперва перерисуешь, а затем снова изменишь. 
Почему плохо с изменением приоритетов: потому что не ты один можешь иметь высокие приоритеты. Виндовс XP не система реального времени и когда есть поток с более высоким приоритетом, другой вообще может никогда не дождаться процессорного времени, то есть зависнуть, таким образом, если в момент твоей отрисовки кто-то другой повысит приоритет, ты можешь получить то же самое. 
Ну блин я погнал smile 

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