Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Приостановить выполнение потока на 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 от виндовс. не бывает, ИМХО.


Наверх

Титульная страница Поиск, карта сайта Написать письмо