В шаге "Шаг 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, которая может изменять тайм аут. Соответственно можно регулировать частоту опроса от максимума до минимума в зависимости от интенсивности трафика сообщений.