|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
Synchronization and Overlapped Input and Output
The Win32 API supports both synchronous and asynchronous (or overlapped) I/O operations on files, named pipes, and serial communications devices. The WriteFile, ReadFile, DeviceIoControl, WaitCommEvent, ConnectNamedPipe, and TransactNamedPipe functions can be performed either synchronously or asynchronously. The ReadFileEx and WriteFileEx functions can be performed asynchronously only.
When a function is executed synchronously, it does not return until the operation has been completed. This means that the execution of the calling thread can be blocked for an indefinite period while it waits for a time-consuming operation to finish. Functions called for overlapped operation can return immediately, even though the operation has not been completed. This enables a time-consuming I/O operation to be executed in the background while the calling thread is free to perform other tasks. For example, a single thread can perform simultaneous I/O operations on different handles, or even simultaneous read and write operations on the same handle.
To synchronize its execution with the completion of the overlapped operation, the calling thread uses the GetOverlappedResult function or one of the wait functions to determine when the overlapped operation has been completed. You can also use the HasOverlappedIoCompleted macro to poll for completion. To cancel all pending asynchronous I/O operations, use the CancelIO function. This function only cancels operations issued by the calling thread for the specified file handle.
Overlapped operations require a file, named pipe, or communications device that was created with the FILE_FLAG_OVERLAPPED flag. To call a function to perform an overlapped operation, the calling thread must specify a pointer to an OVERLAPPED structure. If this pointer is NULL, the function return value may incorrectly indicate that the operation completed. The OVERLAPPED structure must contain a handle to a manual-reset ѕ not an auto-reset ѕ event object. The system sets the state of the event object to nonsignaled when a call to the I/O function returns before the operation has been completed. The system sets the state of the event object to signaled when the operation has been completed.
When a function is called to perform an overlapped operation, it is possible that the operation will be completed before the function returns. When this happens, the results are handled as if the operation had been performed synchronously. If the operation was not completed, however, the function's return value is FALSE, and the GetLastError function returns ERROR_IO_PENDING. A thread can manage overlapped operations by either of two methods:
· Use the GetOverlappedResult function to wait for the overlapped operation to be completed. · Specify a handle to the OVERLAPPED structure's manual-reset event object in one of the wait functions and then call GetOverlappedResult after the wait function returns. The GetOverlappedResult function returns the results of the completed overlapped operation, and for functions in which such information is appropriate, it reports the actual number of bytes that were transferred.
When performing multiple simultaneous overlapped operations, the calling thread must specify an OVERLAPPED structure with a different manual-reset event object for each operation. To wait for any one of the overlapped operations to be completed, the thread specifies all the manual-reset event handles as wait criteria in one of the multiple-object wait functions. The return value of the multiple-object wait function indicates which manual-reset event object was signaled, so the thread can determine which overlapped operation caused the wait operation to be completed.
If no event object is specified in the OVERLAPPED structure, the system signals the state of the file, named pipe, or communications device when the overlapped operation has been completed. Thus, you can specify these handles as synchronization objects in a wait function, though their use for this purpose can be difficult to manage. When performing simultaneous overlapped operations on the same file, named pipe, or communications device, there is no way to know which operation caused the object's state to be signaled. It is safer to use a separate event object for each overlapped operation.
For examples that illustrate the use of overlapped operations, completion routines, and the GetOverlappedResult function, see Using Pipes.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
Синхронизация и Перекрывшая Вклад и Выход
Win32 API Поддерживает как синхронный так и асинхронный (или перекрытое) действия В/В на файлы, назвавшие трубы, и последовательные устройства связи. WriteFile, ReadFile, DeviceIoControl, WaitCommEvent, ConnectNamedPipe, И функции TransactNamedPipe могут быть выполнены или синхронно или асинхронно. ReadFileEx И функции WriteFileEx могут выполняться асинхронно только.
Когда функция выполняется синхронно, она не возвращается пока действие не завершено. Это означает, что выполнение вызова резьбы может быть заблокировано на неопределенный период тогда как оно ждет трудоемкое действие, чтобы завершаться. Функции названные к перекрытому действию могут возвращать немедленно, даже если действие не завершено. Это приспосабливается трудоемкое действие В/В, которое нужно выполняться на фоне тогда как вызывающая резьба свободна, чтобы выполнять другие задачи. Например, единственная резьба может выполнить одновременные действия В/В в других ручках, или даже одновременное чтение и действия записи в той же ручке.
Чтобы синхронизировать свое выполнение с завершением перекрытого действия, вызов резьбы использует функцию GetOverlappedResult или одно из ожидания функционирует, чтобы определяться когда перекрытое действие завершено. Вы можете также использовать макро HasOverlappedIoCompleted, чтобы опрашиваться для завершения. Для того, чтобы отменять все незаконченные асинхронные действия В/В, используйте функцию CancelIO. Эта функция только отменяет действия выпущенные вызовом резьбы для определенной файловой ручки.
Перекрытые действия требуют файл, назвавший трубу, или устройство связи, которые были созданы флагом FILE_FLAG_OVERLAPPED. Для того, чтобы называть функцию, чтобы выполнять перекрытое действие, вызов резьбы должен определить указатель в ПЕРЕКРЫТУЮ структуру. Если этот указатель НЕДЕЙСТВИТЕЛЕН, функциональная обратная величина может неправильно указать, что действие завершало. ПЕРЕКРЫТАЯ структура должна содержать ручку в руководство-восстановленное U не авто-восстановленное U объект случая. Система устанавливает состояние объекта случая против nonsignaled когда вызов в функциональный возврат В/В прежде, чем действие будет завершено. Система устанавливает состояние объекта случая против сигнального когда действие завершено.
Когда функция названа, чтобы выполнять перекрытое действие, она возможно, что действие будет завершено прежде, чем функция возвращается. Когда это случается, результаты прооперированы как будто действие выполнялось синхронно. Если действие не было завершено, тем не менее, функциональная обратная величина - ЛОЖЬ, и функциональный возврат GetLastError ERROR_IO_PENDING. Резьба может управлять перекрытыми действиями любым из двух методов:
Использование функция GetOverlappedResult, чтобы ждать перекрытое действие, которое нужно завершаться. Определять ручку в ПЕРЕКРЫТОЕ структурное руководство-восстановившее объект случая в одной из функций ожидания затем называть GetOverlappedResult после того, как функция ожидания возвращается. Функция GetOverlappedResult возвращает результаты завершенной перекрытой операции, и для функций в которых такая информация подходящая, она сообщает фактическое количество байтов, которые были перевестися.
При выполнении многочисленных одновременных перекрытых операций, вызов резьбы должен определить ПЕРЕКРЫТУЮ структуру с другим руководством-восстановившим объект события для каждой операции. Чтобы ждать любую из перекрытых операций, которые нужно завершаться, резьба определяет все руководство-восстановившее ручки события как критерии ожидания в одной из многочисленных-объектных функций ожидания. Обратная величина многочисленной-объектной функции ожидания указывает какое руководство-восстановившее объект события был сигнализирован, так что резьба может определить, который перекрывал операцию вызывал операцию ожидания, которая нужно завершаться.
Если никакой объект события не определен в ПЕРЕКРЫТОЙ структуре, система сигнализирует состояние файла, назвавшего трубу, или устройство связи когда перекрытая операция завершена. Таким образом, Вы можете определить эти ручки как синхронизацию возражает в функции ожидания, все-же их использование с этой целью может быть трудно управлять. При дрессированных одновременных перекрытых операциях на тот же файл, назвавших трубу, или устройство связи, нет пути знать какую операцию вызвавшую объектное состояние, которое нужно сигнализировать. Это - защита, чтобы использовать отдельный объект события для каждого перекрывшее операцию.
Для примеров, которые иллюстрируют использование перекрытых операций, программ завершения, и функцию GetOverlappedResult, смотри Использование Труб.
|
|
|
|
| |