Страница 315 из 436
#include <windows.h>
…
DCB dcb;
COMMTIMEOUTS ct;
HANDLE port;
DWORD mask;
DWORD bc;
char buf[101];
…
dcb.DCBlength=sizeof(DCB);
BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcb);
dсb.fNull=TRUE;
ct.ReadIntervalTimeout=10;
ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;
ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;
port=CreateFile("COM2",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
SetCommState(port,dcb);
SetCommTimeouts(port,&ct);
PurgeComm(port,PURGE_RXCLEAR);
…
SetCommMask(port,EV_RXCHAR);
WaitCommEvent(port,Smask,NULL);
ReadFile(port,buf,10 0,&bc,NULL);
CloseHandle(port);
…
В данном примере ожидается начало сообщения (первый полученный символ), после чего вызывается функция чтения. Освобождать процессор на время ожидания хорошо, но хотелось бы параллельно с вводом/выводом делать какую-либо полезную работу. Что бы это стало возможным, необходимо в качестве параметра dwFlagsAndAttributes вместо 0 указать FILE_FLAG_OVERLAPPED. Кроме того, для функций ReadFile, WriteFile и WaitCommEvent необходимо в качестве параметра lpOverlapped указывать адрес правильно инициализированной структуры OVERLAPPED.
Структура OVERLAPPED
Структура OVERLAPPED выглядит следующим образом:
typedef struct _OVERLAPPED {{
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
Подробно описывать поля этой структуры не буду, поскольку данная статья не о файловом вводе/выводе вообще, а о работе с портами. Для наших целей, за исключением WaitCommEvent, можно просто обнулить все поля этой структуры. Для WaitCommEvent поле hEvent должно содержать корректный описатель объекта "событие". Что бы все стало понятно, надо разобраться с таким обязательным атрибутом параллельной работы как синхронизация.
Синхронизация нужна для упорядочения доступа к совместно используемым объектам. Предположим, что две программы одновременно пытаются изменить значение общей переменной. Каков будет результат? Скорее всего неопределенный. Что бы этого избежать требуется разрешать доступ второй программы к переменной только после того, как с ней закончила работать первая программа.
Для синхронизации используются различные методы: семафоры, блокировки, события, критические секции и т. п. События являются простейшими синхронизирующими объектами. Они могут находиться только в двух состояниях: установленном (событие произошло или наступило) и сброшенном (событие не произошло или не наступило). События создаются функцией CreateEvent и разрушаются функцией CloseHandle. Установить событие можно функцией SetEvent, а сбросить ResetEvent.
Титов Олег
ЛИТЕРАТУРНЫЕ СТРАНИЦЫ
Отверженные (глава третья)
В. Гюго
Впрочем, он продолжал держать себя так же просто, как и в первые дни. У него были седые волосы, серьезный взгляд, загорелая кожа рабочего, задумчивое лицо философа. Обычно он носил широкополую шляпу и длинный редингот из толстого сукна, застегнутый доверху. Обязанности мэра он выполнял добросовестно, но вне этих обязанностей жил отшельником. Он редко разговаривал с кем-либо. Он уклонялся от расточаемых ему любезностей, кланялся на ходу, быстро исчезал, улыбался, чтобы избежать беседы, и давал деньги, чтобы избежать улыбки. "Славный медведь!" — говорили о нем женщины. Больше всего он любил прогулки по окрестным полям.
Он всегда обедал в одиночестве, держа перед собой открытую книгу. У него была небольшая, но хорошо подобранная библиотека. Он любил книги; книги — это друзья, бесстрастные, но верные. По мере того как вместе с богатством увеличивался и его досуг, он, видимо, старался употребить его на то, чтобы развивать свой ум. С тех пор как он поселился в Монрейле-Приморском, речь его с каждым годом становилась все более изысканной и более мягкой, что было замечено всеми.
Он часто брал с собой на прогулку ружье, но редко им пользовался. Когда же ему случалось выстрелить, он обнаруживал такую меткость, что становилось страшно Он никогда не убивал безвредных животных. Никогда не стрелял в птиц.
Он был уже далеко не молод, но о его физической силе рассказывали чудеса Он предлагал помощь всякому, кто в ней нуждался: поднимал упавшую лошадь, вытаскивал увязшее колесо, останавливал, схватив за рога, вырвавшегося быка. Он всегда выходил из дому с полным карманом денег, а возвращался с пустым. Когда он заходил в деревни, оборванные ребятишки весело бежали за ним следом, кружась возле него, словно рой мошек.
Можно было предположить, что когда-то он живал в деревне, потому что у него был большой запас полезных сведений, которые он сообщал крестьянам. Он учил их уничтожать хлебную моль, обрызгивая амбары и заливая щели в полу раствором поваренной соли, и выгонять вредных жуков, развешивая повсюду, на стенах, на крыше, на пастбищах и в домах, пучки цветущего шалфея. У него были "рецепты", как выводить с полей куколь, журавлиный горох, лисий хвост — сорные травы, заглушающие хлебные злаки. Он охранял кроличий садок от крыс, сажая туда морскую свинку, запаха которой они не выносят.
Однажды он увидел, что местные жители усердно трудятся над уничтожением крапивы; взглянув на кучу вырванных с корнем и уже засохших растений, он сказал: "Завяла. А ведь если бы знать, как за нее взяться, она могла бы пойти в дело. Когда крапива еще молода, ее листья — вкусная зелень, а в старой крапиве — такие же волокна и нити, как в конопле и льне. Холст из крапивы ничем не хуже холста из конопли. Мелко изрубленная крапива годится в корм домашней птице, а толченая хороша для рогатого скота. Семя крапивы, подмешанное к корму, придает блеск шерсти животных, а ее корень, смешанный с солью, дает прекрасную желтую краску. Кроме того, это отличное сено, которое можно косить два раза в лето. А что нужно для крапивы? Немного земли, и никаких забот и ухода. Правда, семя ее, по мере созревания, осыпается, и собрать его бывает нелегко. Вот и все. Приложите к крапиве хоть немного труда, и она станет полезной; ею пренебрегают, и она становится вредной. Тогда ее убивают. Как много еще людей, похожих на крапиву! — После минутного молчания он добавил: — Запомните, друзья мои: нет ни дурных трав, ни дурных людей. Есть только дурные хозяева"
Дети любили его еще и за то, что он умел делать хорошенькие вещицы из соломы и скорлупы кокосовых орехов.
Когда он видел, что дверь церкви затянута черным, он входил туда; похороны привлекали его так же, как других привлекают крестины. Чужая утрата и чужое горе притягивали его к себе, потому что у него было доброе сердце; он смешивался с толпой опечаленных друзей, с родственниками, одетыми в траур, и священнослужителями, молившимися за усопшего. Казалось, он охотно погружался в размышления, внимая погребальным молитвам, полным видений иного мира. Устремив взгляд в небо, как бы порываясь к тайнам бесконечного, он слушал скорбные голоса, поющие на краю темной бездны, называемой смертью.
Он творил множество добрых дел тайком, как обычно творят дурные.
Вечером он украдкой проникал в дома, тихонько пробирался по лестницам. Какой-нибудь бедняга, поднявшись на свой чердак, находил дверь отпертой, а иной раз даже взломанной. "Здесь побывали воры!" — восклицал несчастный. Он входил к себе, и первое, что бросалось ему в глаза, была золотая монета, кем-то забытая на столе. Побывавшим у него "вором" оказывался дядюшка Мадлен.