В шаге "Шаг 155 - Создаем сервер почтового слота". Мы использовали MAILSLOT_WAIT_FOREVER для того, чтобы заблокировать операции чтения, но можно и использовать таймаут, в результате которого через указанное время блокировка сервера будет снята. Тогда придется постоянно обращаться к функции ReadFile для того, чтобы получить сообщения. Можно вот так:
#include "stdafx.h" #include "windows.h" #include "iostream.h" void main() { HANDLE hsl=NULL; hsl= CreateMailslot("\\\\.\\mailslot\\he",0,5,NULL); if (hsl!=INVALID_HANDLE_VALUE) { cout << "Ok Created mailslot" << endl; char buffer[255]; DWORD nBytesRead; while (true) { if (ReadFile(hsl, &buffer, 255, &nBytesRead, NULL)!=0) { cout << "Ok read" << endl; cout << buffer << endl; int i; cin >> i; return; } cout << "time aut" << endl; } } }
Есть еще одна полезная функция которая может дать нам информацию, что в слоте что-то есть.
BOOL GetMailslotInfo ( HANDLE hMailslot, // указатель на слот LPDWORD lpMaxMessageSize, // максимальный размер LPDWORD lpNextSize, // размер следующего LPDWORD lpMessageCount, // количество сообщений LPDWORD lpReadTimeout // тайм аут. );
Можно и ее применить для того, чтобы обнаружить что-то в слоте.
#include "stdafx.h" #include "windows.h" #include "iostream.h" void main() { HANDLE hsl=NULL; hsl= CreateMailslot("\\\\.\\mailslot\\he",0,5,NULL); if (hsl!=INVALID_HANDLE_VALUE) { cout << "Ok Created mailslot" << endl; char buffer[255]; DWORD nBytesRead; while (true) { DWORD dwmes=0; if (GetMailslotInfo(hsl,NULL,NULL,&dwmes,NULL)!=0) { if (dwmes>0) { if (ReadFile(hsl, &buffer, 255, &nBytesRead, NULL)!=0) { cout << "Ok read" << endl; cout << buffer << endl; int i; cin >> i; return; } } } cout << "time aut" << endl; } } }
Эффект тот же, то ведь есть и функция SetMailslotInfo, которая может изменять тайм аут. Соответственно можно регулировать частоту опроса от максимума до минимума в зависимости от интенсивности трафика сообщений.