![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Andrey88 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 2.11.2006 Репутация: нет Всего: нет |
Вобщем я должен написать функцию потока, в которой будут два следующих нехитрых действия:
1) считать число 2) по результатам считанного числа выдать другое число Физически есть коробка с "демоном" внутри. Демон каждый n милисекунд меняет счётчик. Т.е. на цифирблате устройства меняется номер ячейки для отображения - и я должен успеть на нужную ячейку подать нужные данные. Но на практике столкнулся с тем, что выполнение прерывается посередине, и данные выводятся на следующую ячейку. Посоветуйте чего можно сделать плиzzz! Пока есть только вариант менять приретет потока - до начала выполнения поставить большой, а после сделать обратно нормальным. Это сообщение отредактировал(а) Andrey88 - 28.11.2006, 16:26 |
|||
|
||||
| RatHat |
|
|||
![]() Вождь индейцев ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 5.9.2005 Репутация: 1 Всего: 1 |
Код показывай - будем думать: проще посмотреть, где ошибка, чем придумывать с нуля.
Да и тебе проще понять будет. --------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i |
|||
|
||||
| Andrey88 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 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 сделать непрерывно выполняемым... Вызываются написанные мной функции, которые работают с железякой... |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
а вообще, такие штуки надо в rtos делать... |
|||
|
||||
| Andrey88 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 2.11.2006 Репутация: нет Всего: нет |
Спасибо!!!
А в моём варианте наверно много ресурсов будт уходить на изменение приорететов... А как это надо в идеале делать? В смысле что за слово или абривиатура такая? real time os??? Это сообщение отредактировал(а) Andrey88 - 30.11.2006, 18:49 |
|||
|
||||
| dumb |
|
||||||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 27 Всего: 158 |
у тебя получается от
до
- один jmp и кстати, это вообще нерабочий код - функция для установки приоритета процесса, а псевдо-хэндл берешь от потока... да. то бишь не виндоус ни разу. Добавлено @ 20:51 поправочка к последней фразе: для виндузы вроде как ядра альтернативные существуют... |
||||||
|
|||||||
| Andrey88 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 21 Регистрация: 2.11.2006 Репутация: нет Всего: нет |
Спасибо!
Что код не рабочий я понял - я его пока не запускал. Мне к аппаратуре тока завтра подобратся возможность будет... |
|||
|
||||
| takedo |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 501 Регистрация: 1.6.2005 Репутация: -1 Всего: 3 |
так, если не успевает отрисоваться, то сделай отрисовку в обработчике сообщения WM__ТВОЕСООБЩЕНИЕНАОТРИСОВКУ. А из своего потока шли в окно где отрисовываешь сообщение по SendMessage. Этим гарантированно добьешся того, что сперва перерисуешь, а затем снова изменишь.
Почему плохо с изменением приоритетов: потому что не ты один можешь иметь высокие приоритеты. Виндовс XP не система реального времени и когда есть поток с более высоким приоритетом, другой вообще может никогда не дождаться процессорного времени, то есть зависнуть, таким образом, если в момент твоей отрисовки кто-то другой повысит приоритет, ты можешь получить то же самое. Ну блин я погнал -------------------- я не гольфист - я хоккеист |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |