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