| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||
а вообще, такие штуки надо в rtos делать... |
| Автор: Andrey88 30.11.2006, 18:48 |
| Спасибо!!! А в моём варианте наверно много ресурсов будт уходить на изменение приорететов... А как это надо в идеале делать? В смысле что за слово или абривиатура такая? real time os??? |
| Автор: Andrey88 30.11.2006, 20:55 |
| Спасибо! Что код не рабочий я понял - я его пока не запускал. Мне к аппаратуре тока завтра подобратся возможность будет... |
| Автор: takedo 8.12.2006, 09:37 |
| так, если не успевает отрисоваться, то сделай отрисовку в обработчике сообщения WM__ТВОЕСООБЩЕНИЕНАОТРИСОВКУ. А из своего потока шли в окно где отрисовываешь сообщение по SendMessage. Этим гарантированно добьешся того, что сперва перерисуешь, а затем снова изменишь. Почему плохо с изменением приоритетов: потому что не ты один можешь иметь высокие приоритеты. Виндовс XP не система реального времени и когда есть поток с более высоким приоритетом, другой вообще может никогда не дождаться процессорного времени, то есть зависнуть, таким образом, если в момент твоей отрисовки кто-то другой повысит приоритет, ты можешь получить то же самое. Ну блин я погнал |