Текущий архив: 2011.01.23;
Скачать: CL | DM;
Вниз
Приостановить выполнение потока на 1 мс или меньше. Найти похожие ветки
← →
ilyas09 (2010-10-30 09:54) [0]Задача: в потоке производится чтение и обработка данных из драйвера аппаратного устройства. Когда данные в буфере заканчиваются необходимо на короткое время приостановить выполнение потока, чтобы основной поток приложения и другие приложение смогли поработать.
Так как хочется сделать задержку как можно короче, то Sleep(1) не подходит. Чем её можно заменить? Может быть есть процедура просто передающая выполнение Windows?
← →
sniknik © (2010-10-30 11:53) [1]> то Sleep(1) не подходит. Чем её можно заменить?
Sleep(0)... но тоже не гарантия, что задержка не окажется например 5 мин...
> Может быть есть процедура просто передающая выполнение Windows?
т.е. тебе нужен ProsessMessage от виндовс. не бывает, ИМХО.
← →
ilyas09 (2010-10-30 12:14) [2]sniknik, ProsessMessage выполняет только события моей программы или выполняются и другие программы запущенные в windows?
← →
Anatoly Podgoretsky © (2010-10-30 12:30) [3]> sniknik (30.10.2010 11:53:01) [1]
А задержку в пол миллисекунды указывать как 0,5
← →
Anatoly Podgoretsky © (2010-10-30 12:31) [4]> ilyas09 (30.10.2010 12:14:02) [2]
ProsessMessage это опрос очереди сообщений!
← →
ilyas09 (2010-10-30 12:37) [5]Anatoly Podgoretsky, извиняюсь за непонятливость, но ProsessMessage это опрос очереди сообщений чего?
← →
sniknik © (2010-10-30 12:48) [6]> извиняюсь за непонятливость
это потому что читаешь кусками, понравившиеся части. попробуй прочитать остальное
> т.е. тебе нужен ProsessMessage от виндовс. не бывает, ИМХО.
← →
sniknik © (2010-10-30 12:50) [7]хотя, он бы тоже не помог, сам то он времени не занимает практически, но вот вызываемая им работа по событию, может притормозить надолго.
← →
Плохиш © (2010-10-30 13:22) [8]
> в потоке производится
> приостановить выполнение потока, чтобы основной поток приложения
> и другие приложение смогли поработать.
Если это те потоки, про которые я подумал, то автору надо нанять программиста.
← →
sniknik © (2010-10-30 15:02) [9]а программист быстренько напишет операционную систему реального времени... :о)
← →
sniknik © (2010-10-30 15:03) [10]p.s. можно конечно и работу с устройством по другому организовать, но это же скучно, правда ведь?
← →
ilyas09 (2010-11-01 12:10) [11]Любите вы, господа, говорить загадками. :)
Во-первых, мне не требуются точные измерения времени задержки.
Во-вторых, мне не требуется большое постоянство. Если задержка вдруг однократно окажется не 100 мкс, а 10 секунд, то это приведёт только к уменьшению скорости работы.
Со sleep(0) всё нормально работает, обновляется и ворма и другие программы, но загрузка процессора по одному ядру вырастает до 100% - что и понятно.
При этом, при отсутствии активной работы других программ, за 10 секунд производится 2 000 000 вызовов функции sleep(0), т.е. sleep(0) даёт среднюю задержку порядка 5 мкс.
Кароче, хочется просто уменьшить загрузку процессора усыпив программу микросекунд на 200, в среднем.
Впрочем, если это невозможно, то оставлю sleep(0).
← →
brother © (2010-11-01 12:12) [12]> усыпив программу микросекунд на 200
О_о не думаю, что у тебя это получится
← →
clickmaker © (2010-11-01 12:19) [13]> в потоке производится чтение и обработка данных из драйвера
> аппаратного устройства. Когда данные в буфере заканчиваются
> необходимо на короткое время приостановить выполнение потока,
> чтобы основной поток приложения и другие приложение смогли
> поработать
ничё не понятно. Если чтение в отдельном потоке, то почему остальные не могут поработать?
← →
Сергей М. © (2010-11-01 12:33) [14]
> ilyas09
Никакие "задержки" в твоей задаче нафих не нужны.
Достаточно задействовать работу с устройством в асинхронном режиме с использованием overlap-механизма нотификаций.
Все то время пока твой поток будет хдать очер.порции данных от устройства, он будет находиться в kernel-time и не будет отнимать у планировщика потоков временные кванты на свое обслуживание.
← →
Германн © (2010-11-01 12:43) [15]
> ничё не понятно. Если чтение в отдельном потоке, то почему
> остальные не могут поработать?
Synchronize(DoWork);
Страницы: 1 вся ветка
Текущий архив: 2011.01.23;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.01 c