Шаг 159 - Подходы к созданию сервера MailSlot

В шаге "Шаг 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;
		}
	}
}

159_1.gif (5151 b)

Есть еще одна полезная функция которая может дать нам информацию, что в слоте что-то есть.

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


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 19.11.2001