Первый признак псевдонаучного бреда на физмат темы - отсутствие формул (или наличие тривиальных, на уровне школьной арифметики) - имеется :)
Отсутствие ссылок на чужие работы - тоже.
Да эти все формальные критерии и ни к чему, и так видно, что автор в физике остановился на уровне учебника 6-7 класса. Даже на советскую "Детскую энциклопедию" не тянет.
Чего их всех так тянет именно в физику? писали б что-то юридически-экономическое
подробнее ...
:)
Впрочем, глядя на то, что творят власть имущие, там слишком жесткая конкуренция бредологов...
От его ГГ и писанины блевать хочется. Сам ГГ себя считает себя ниже плинтуса. ГГ - инвалид со скверным характером, стонущим и обвиняющий всех по любому поводу, труслив, любит подхалимничать и бить в спину. Его подобрали, привели в стаб и практически был на содержании. При нападений тварей на стаб, стал убивать охранников и знахаря. Оправдывает свои действия запущенным видом других, при этом точно так же не следит за собой и спит на
подробнее ...
тряпках. Все кругом люди примитивные и недалёкие с быдлячами замашками по мнению автора и ГГ, хотя в зеркале можно увидеть ещё худшего типа, оправдывающего свои убийства. При этом идёт трёп, обливающих всех грязью, хотя сам ГГ по уши в говне и просто таким образом оправдывает своё ещё более гнусное поведение. ГГ уже не инвалид в тихушку тренируется и всё равно претворяет инвалидом, пресмыкается и делает подношение, что бы не выходить из стаба. Читать дальше просто противно.
Слог хороший, но действие ГГ на уровне детсада. ГГ -дурак дураком. Его квартиру ограбили, впустил явно преступников, сестру явно украли.
О преступниках явившихся под видом полиции не сообщает. Соглашается с полицией не писать заявление о пропаже сестры. Что есть запрет писать заявление ранее 3 дней? Мало ли, что кто-то не хочет работать, надо входить в их интерес? Есть прокуратура и т.д., что может заставить не желающих работать. Сестра не
подробнее ...
пришла домой и ГГ отправляется в общественную библиотеку, пялясь на баб. Если ГГ и думает, то головкой ниже пояса. Писатель с наслаждением описывает смену реакции на золотую карту аристо. Диалоги туповатые, на уровне ребёнка и аналогичным поведением. История драки в школе с кастетами и войнами не реально глупая. Обычно такие тупые деологи с полицией, когда один сознаётся в навете оканчивается реальным сроком. Когда в руки ГГ попали вымогатели с видео сестры, действия ГГ стали напоминать дешевый спектакль. Мне данный текст не понравился, сказочно глупый.
ERROR_IO_INCOMPLETE. Если функция GetOverlappedResult завершилась с кодом возврата FALSE, и другим кодом ошибки, то ошибка произошла именно при вызове самой функции. Если параметр fWait равен TRUE, то функция будет дожидаться завершения операции ввода-вывода.
Замечу, что ожидать завершения ввода/вывода с помощью функции GetOverlappedResult не самое правильное решение. При работе с дисковым файлом операция завершится гарантированно, а при работе с последовательным или параллельным портом совсем не обязательно. Представьте, что Вы не настроили тайм-ауты последовательного порта, а подключенное устройство неисправно. GetOverlappedResult будет ждать вечно, так как нет способа указать максимальное время ожидания. Ждать завершения ввода/вывода лучше с помощью функций:
DWORD WaitForSingleObject(HANDLE hObject, DWORD dwTimeout);
DWORD WaitForMultipleObjects(DWORD cObjects, LPHANDLE lpHandles, BOOL bWaitAll, DWORD dwTimeout);
Как следует из названия, эти функции предназначены для ожидания одного или нескольких объектов. Однако следует вспомнить примечание, которое я привел к описанию структуры OVERLAPPED! Поэтому не мудрствуя лукаво будем ожидать только объекты event.
Функция WaitForSingleObject ожидает только один объект задаваемый первым параметром. Вторым параметром задается максимальное время ожидания наступления события в миллисекундах. Если вместо времени указана магическая величина INFINITE, то событие будет ожидаться вечно.
Функция WaitForMultipleObjects ждет несколько событий. Первый параметр указывает сколько именно, а второй задает массив дескрипторов этих событий. Замечу, что один и тот же дескриптор нельзя указывать в этом массиве более одного раза. Третий параметр задает тип ожидания. Если он равен TRUE, то ожидается наступление всех событий. Если FALSE, то наступления любого одного из указанных. И естественно тоже можно задать максимальное время ожидания последним параметром.
Если событие наступило, то функции возвращают значения от WAIT_OBJECT_0 до WAIT_OBJECT_0+cObject-1. Естественно, что WaitForSingleObject может вернуть только WAIT_OBJECT_0 (если конечно не произошло ошибки). Если произошла ошибка, то будет возвращено WAIT_FAILED. При превышении максимального времени ожидания функции вернут WAIT_TIMEOUT.
Вернусь к объектам event, которые мы собственно и используем для ожидания. Поясню, почему для наших целей требуются события с ручным сбросом. Функции ReadFile и WriteFile в асинхронном режиме первым делом сбрасывают (переводят в занятое состояние) как дескриптор файла, так и дескриптор объекта event задананный в структуре OVERLAPPED. Когда операция чтения или записи завершается система устанавливает эти дескрипторы в свободное состояние. Тут все логично. Однако и функции WaitForSingleObject и WaitForMultipleObjects для событий с автоматическим сбросом так же выполняют их перевод в занятое состояние при вызове. Для событий с ручным сбросом этого не происходит. Теперь представьте, что операция ввода/вывода завершилась ДО вызова WaitForSingleObject. Представили? Для событий с автоматическим сбросом снова будет выполнен перевод объекта в занятое состояние. Но освобождать то его будет некому! Более подробная информация об объектах event выходит за рамки этой статьи.
Теперь небольшой пример. Все подробности, не относящиеся к работе в асинхронном режиме я опускаю.
#include <windows.h>
#include <string.h>
. . .
HANDLE port;
char* buf;
OVERLAPPED ovr;
DWORD bc;
. . .
port=CreateFile("COM2", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);
memset(&ovr, 0, sizeof(ovr));
ovr.hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
ReadFile(port, buf, buf_size, &bc, &ovr);
/* Выполняем некую полезную работу */
if (WaitForSingleObject(ovr.hEvent,10000) == WAIT_OBJECT_0) {
GetOverlappedResult(port, &ovr, &bc, FALSE);
} else {
/* Обработка ошибки */
}
CloseHandle(port);
CloseHandle(ovr.hEvent);
В этом примере переменная bc, предназначенная для получения количества считанных байт, после вызова ReadFile будет равна 0, так как никакой передачи информации еще не было. После вызова GetOverlappedResult в эту переменную будет помещено число реально считанных байт.
Безусловно, можно придумать очень сложные схемы распараллеливания ввода/вывода и вычислений, базирующиеся на использовании асинхронных операций и объектов event. Позволю себе не приводить реально работающих примеров программ. Таких программ работающих в реальном масштабе времени много, но они очень сложны и громоздки для этой статьи.
Вернемся ненадолго с структуре OVERLAPPED и функциям ReadFile и WriteFile. Для дискового ввода/вывода возможно задать одновременно несколько конкурирующих операций чтения/записи. Однако для каждой такой операции необходимо использовать свою структуру OVERLAPPED. Для работы с портами нельзя задавать конкурирующие операции. Точнее можно, но только в Windows NT. Поэтому для целей совместимости лучше этого не делать.
Теперь, уже совсем кратко, еще об одной возможности, реализованной только в Windows NT. Речь идет о "тревожном вводе-выводе". Эта возможность реализуется функциями ReadFileEx, WriteFileEx и SleepEx. Суть использования данных функий такова. Вы вызываете расширенную функцию записи или чтения, которая имеет еще один параметр – адрес функции завершения. После чего, вызвав расширенную функцию засыпания,
Последние комментарии
7 часов 43 минут назад
15 часов 43 минут назад
1 день 6 часов назад
1 день 10 часов назад
1 день 10 часов назад
1 день 10 часов назад