Сейчас на форуме: tyns777 (+4 невидимых) |
![]() |
eXeL@B —› Программирование —› Небольшие полезные коды |
<< . 1 . 2 . 3 . |
Посл.ответ | Сообщение |
|
Создано: 09 февраля 2010 18:42 · Поправил: Vol4ok · Личное сообщение · #1 Часто во время написания проектов возникают небольшие, но при этом довольно общие задачи, которые потом могут быть использованы в будущем, вот эта тема как раз для этого. В этой теме предлагаю размещать небольшие фрагменты кода, которые могут применятся в повседневной практике системного программирования. В этом топике можно - размещать только свои коды, а не копировать из общедоступных источников - желательно хорошо протестировать код, прежде чем разместить его. Если вы не уверены, что код работает точно будет работать так как надо на всех ОС и всех процах, то надо пометить - где и каким образом тестировался этот код, или вообще написать что код не тестирован (хорошо подумав при это, стоит ли вообще такой код размещать). - нормально его оформить, чтобы тот кому этот код пригодится смог разобраться в нем быстрее чем писать это же с нуля. Обязательно должны быть описания входных и выходных данных. Крайне приветствуются цели создания кода, основные требования которым он удовлетворяет, и описание того как работает этот код. Также приветствуются багфиксы, замечания по коду и варианты оптимизации. Итак начну с себя. Недавно столкнулся с необходимостью делать высокоточные паузы в работе кода, в моем случае необходимо было достигать точности десятых милисекунд. В итоге я написал микросекундный таймер Code:
- timeout - время таймаута в микросекундах код рекомендуется выполнять с повышением точности обыкновенного слипа, например так: #include <Mmsystem.h> ... timeBeginPeriod(1); precision_sleep(timeout); timeEndPeriod(1); Код делает таймауты с микросекундой точностью. Как извесно простой Sleep имеет огромную погрешность, допутим Sleep(1) - в нормальных условиях выполнется около 10-15мс (1,5-2мс при установке timeBeginPeriod(1)). Высокая точность достигается за счет использования цикла опроса высокоточного системного таймера (период <1нс - на современных компах и 300-400нс на более старых). Минимальная погрешность данной функции равна времени вызова QueryPerformanceCounter - которое на современных компах равно 200-300нс, на компах по старше может доходить до микросекунды. Ес-но в условиях нехватки процессорного времени погрешность может значительно возрастать. Конечно такой метод измерения сильно грузит проц, поэтому при ожидании более 1мс будет использоваться обыкновенный слип, но поскольку он имеет большую погрешность, то динамически в при многократном вызове, precision_sleep проводит пересчет предельной погрешности слипа, подгоняя его под оптимальное значение, при котором будет сохранена хорошая точность при минимальной нагрузке на процессор. Однако не смотря на это всегда имеется вероятность того что слип превысит предельное время и внесет дополнительную погрешность. Код тестировался на 2х ядероном компе с процом core2duo и на старом одноядерном Celeron-е При тестировании интервалов больших 3мс загрузка процессора скачет 1% до 15%, при интервалах больих 10мс в средем чтото около 2-3%. Хуже всего дело обстоит с таймаутами порядка 1мс и менее, загрузка может быть очень большой, так как слип в этом случае не работает, чуть чуть улутшить положение можно если заменить for (i=0;i<YIELD_LOOP;i++) YieldProcessor(); на Sleep(0), будет небольшая потеря точности, на моем компе Sleep(0) работает примерно за 1-2мкс (на старых компах может быть еще больше) когда YIELD_LOOP работает < 1 мкс Данный код может быть использован при написании сетевых приложений, например для того чтобы точно регуоировать скорость выходного трафика. ![]() |
|
Создано: 02 июня 2010 23:16 · Поправил: punxer · Личное сообщение · #2 |
|
Создано: 02 июня 2010 23:22 · Личное сообщение · #3 Подмена ввода, возможна глобально. txt содержит выводимую строку Code:
![]() |
|
Создано: 17 июня 2010 20:23 · Личное сообщение · #4 Каждый раз начиная проект по разработке программы консольного типа мне становится влом парсить опции командной строки и если их там слишком много, то в разы ломает. Для этой цели написал небольшую библиотеки с небольшим классом, помогающая парсить опции командной строки. Будут замечания, пишите, мыло в readme.txt, который внутри архива. ![]() ![]() |
|
Создано: 17 июня 2010 20:37 · Личное сообщение · #5 |
|
Создано: 18 июня 2010 00:02 · Личное сообщение · #6 |
|
Создано: 11 июля 2010 00:51 · Поправил: Clerk · Личное сообщение · #7 Code:
Получаем базу ntdll: Code:
и ядра: Code:
![]() |
|
Создано: 27 июля 2010 03:23 · Поправил: DenCoder · Личное сообщение · #8 Code:
----- IZ.RU ![]() |
|
Создано: 27 июля 2010 03:25 · Личное сообщение · #9 Code:
----- IZ.RU ![]() |
|
Создано: 13 августа 2010 00:11 · Поправил: Vol4ok · Личное сообщение · #10 Реализаций RWLock-ов в виде класса для С++ - сделаны по аналогии ERESOURCE в ядре. Класс незаменим когда нужен рекурсивный доступ к разделяемому ресурсу, windows не предоставляет в user-mode таких синхрообъектов. Крайне высокой производительностью класс не отличается, особенно при высокой конкуренции потоков, но для обеспечения безопасного доступа к разделяемы объектам, при невысокой конкуренции - идеально подходит. Класс протестирован. Code:
![]() |
<< . 1 . 2 . 3 . |
![]() |
eXeL@B —› Программирование —› Небольшие полезные коды |