при использовании CreateFile( "\\\\.\\mailslot\\name_slot",....) винды нормально отрабатывают запись в него, если вместо точки поставить сетевое имя (даже собственной машины) винды перестают понимать что делать с данными, занятость проца подскакивает до 100%, всё нахрен виснет и уже не разгребается! Вопрос вообщем-то такой — кто использовал запись в слоты??? Где тут возможны подвохи?
Здравствуйте Alex Smirnov, Вы писали:
AS>при использовании CreateFile( "\\\\.\\mailslot\\name_slot",....) винды нормально отрабатывают запись в него, если вместо точки поставить сетевое имя (даже собственной машины) винды перестают понимать что делать с данными, занятость проца подскакивает до 100%, всё нахрен виснет и уже не разгребается! Вопрос вообщем-то такой — кто использовал запись в слоты??? Где тут возможны подвохи?
я ипользовал Mailslot для посылки сообщений на Messanger, риф быль только один, передавать разом оказалось возможным не более 400 байт, хотя в MSDN написано что нельзя более 128 байт (я так понимаю это максимальный размер SMB пакета)
Здравствуйте Ed.ward, Вы писали:
EW>я ипользовал Mailslot для посылки сообщений на Messanger, риф быль только один, передавать разом оказалось возможным не более 400 байт, хотя в MSDN написано что нельзя более 128 байт (я так понимаю это максимальный размер SMB пакета)
У меня прога с оЧЧЕЕЕНь большой частотой пишет в слоты. Получается кусок типа такого:
где-то ранее:
int m_iMaxMailSlotSize = 400;
MyWrite( char* Name, char* pData, int iSizeData)
{
HANDLE m_hSlot = CreateFile( Name, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
if(m_hSlot == INVALID_HANDLE_VALUE) return;
for( ; iSizeData > 0; iSizeData -= m_iMaxMailSlotSize)
{
int iSize = (iSizeData < m_iMaxMailSlotSize) ? iSizeData : m_iMaxMailSlotSize;
if(!WriteFile( m_hSlot, pData, iSize, &dwWriten, NULL))
break;
pData += m_iMaxMailSlotSize;
}
CloseHandle( m_hSlot);
}
main()
{
.....
....
while()
{
...
...
Имя слота выдаёт функция в которой ищется не используемый в данный момент слот.
MyWrite( Name, data, size);
}
}
В какой-то момент для записи выбирается слот в который мы только что писали,и при попытки его использовать
винды отчебучивают или наложение данных при приёме у сервера,или просто что-то начинают предпринимать такое серьёзное
что забивают весь проц. на 100%.
Здравствуйте Alex Smirnov, Вы писали:
AS>при использовании CreateFile( "\\\\.\\mailslot\\name_slot",....) винды нормально отрабатывают запись в него, если вместо точки поставить сетевое имя (даже собственной машины) винды перестают понимать что делать с данными, занятость проца подскакивает до 100%, всё нахрен виснет и уже не разгребается! Вопрос вообщем-то такой — кто использовал запись в слоты??? Где тут возможны подвохи?
Когда-то писал все нормально работало...
попробуй добавить путь к слоту не должно, конечно повлиять, но кто их, в M$ знает???
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
AS>В какой-то момент для записи выбирается слот в который мы только что писали,и при попытки его использовать AS>винды отчебучивают или наложение данных при приёме у сервера,или просто что-то начинают предпринимать такое серьёзное AS>что забивают весь проц. на 100%.
На мой взгляд, проблемы могут быть вызваны из-за несоблюдения следущих моментов:
The final problem with Windows 95 and 98 worth mentioning is memory leaks, which can occur when you're using timeout values on mailslots. When you create a mailslot using the CreateMailslot function with a timeout value greater than 0, the ReadFile function leaks memory when the timeout expires and the function returns FALSE. After many calls to the ReadFile function, the system becomes unstable and subsequent ReadFile calls whose timers expire start returning TRUE. As a result, the system is no longer able to execute other MS-DOS applications. To work around this, create the mailslot with a timeout value of either 0 or MAILSLOT_WAIT_FOREVER. This will prevent an application from using the timeout mechanism, which causes the actual memory leak.
CreateMailslot returns the handle hFile. The lpBuffer and nNumberOfBytesToRead parameters determine how much data can be read off a mailslot. It is important to make the size of this buffer greater than the nMaxMessageSize parameter from the CreateMailslot API call. Additionally, the buffer must be larger than incoming messages on the mailslot; if it is not larger, ReadFile will fail with the error ERROR_INSUFFICIENT_BUFFER. The lpNumberOfBytesRead parameter reports the actual number of bytes read when the ReadFile operation completes.
Если вы хотите закрыть тему, то не надо голосовать за удаление! Лучше напишите сообщение, содержащее какой-нибудь результат, ответ на ваш вопрос, например. Может кому пригодится. По этой же причине считаю удаление темы нецелесообразным и оставляю сообщение жить в WinAPI. Долгих ему лет!
Напишите, какой вы для себя сделали вывод.
Это, конечно, просьба и вас ни к чему не обязывает.
Здравствуйте, Alex Smirnov, Вы писали:
AS>при использовании CreateFile( "\\\\.\\mailslot\\name_slot",....) винды нормально отрабатывают запись в него, если вместо точки поставить сетевое имя (даже собственной машины) винды перестают понимать что делать с данными, занятость проца подскакивает до 100%, всё нахрен виснет и уже не разгребается! Вопрос вообщем-то такой — кто использовал запись в слоты??? Где тут возможны подвохи?
Если нужна работа с mailslot под Delphi/C++Builder, то готовые компоненты есть в библиотеке globus.lib: здесь