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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> функция потока, выполняемая без передачи управлени 
:(
    Опции темы
Andrey88
Дата 28.11.2006, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

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

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

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

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

Это сообщение отредактировал(а) Andrey88 - 28.11.2006, 16:26
PM MAIL   Вверх
RatHat
Дата 28.11.2006, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вождь индейцев
*


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

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



Код показывай - будем думать: проще посмотреть, где ошибка, чем придумывать с нуля.
Да и тебе проще понять будет.
--------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i
PM MAIL   Вверх
Andrey88
Дата 30.11.2006, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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

    /** Функция потока, реализует основную функциональность класса
    * @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 сделать непрерывно выполняемым...
Вызываются написанные мной функции, которые работают с железякой...
PM MAIL   Вверх
dumb
Дата 30.11.2006, 18:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Код

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

PM MAIL   Вверх
Andrey88
Дата 30.11.2006, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо!!!
А в моём варианте наверно много ресурсов будт уходить на изменение приорететов...

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

Это сообщение отредактировал(а) Andrey88 - 30.11.2006, 18:49
PM MAIL   Вверх
dumb
Дата 30.11.2006, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Цитата(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 
поправочка к последней фразе: для виндузы вроде как ядра альтернативные существуют...
PM MAIL   Вверх
Andrey88
Дата 30.11.2006, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо!

Что код не рабочий я понял - я его пока не запускал. Мне к аппаратуре тока завтра подобратся возможность будет...
PM MAIL   Вверх
takedo
Дата 8.12.2006, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

Репутация: -1
Всего: 3



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


--------------------
я не гольфист - я хоккеист
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.0503 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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