WaitForMultipleObjects and signaled event: strange behavior

From
Igor Dontsov ()
To
All
Date
2002-03-16T04:01:30Z
Area
SU.WINDOWS.NT.PROG
From: Igor Dontsov <dontsovigor@tula.net>

Доброго времени суток, All!

Нарвался на довольно странное поведение системы.. (пока разбирался в
чем дело, написал с нуля совсем простой тест, воспроизводящий картину,
код ниже)

Картина такова: Поток коннектинся с помощью WinInet api к Ftp серверу
и уходит в цикл. В цикле выполняется полезная функция -- перебор
файлов в папке на ftp. Цикл продолжается до тех пор, пока одно из двух
событий, ожидаемых WaitForMultipleObjects() не станет отмеченным.

По ошибке я проверял значение, возвращаемое WaitForMultipleObjects
только на равенство WAIT_OBJECT_0, а у меня второе событие переходило
в отмеченное состояние. Поэтому сигнал не отлавливался и цикл крутился
дальше.

Через некоторое время, после того, как ожидание начинает вестись с
отмеченнм событием, начинают завершаться с ошибкой вызовы
ftpfindfirst. если подождать еще немного, поток блокируется в вызове
ftpfindfirst.

Кроме того, частично блокируется вообще ftp на машине: захожу на ftp
клиентом, даю команду dir (ls), и так же подвисаю.

Ниже код, воспроизводящий описанное.
Какие-нибудь идеи почему так происходит? Спасибо...

//////////////////////////////////

#include "stdafx.h"
#include <windows.h>
#include <wininet.h>
#include <stdio.h>

void findFilesOnFtp(HINTERNET hFtp)
{
	WIN32_FIND_DATA	w32fd = { 0 };
	HINTERNET		hFind;
	char			szSearch[MAX_PATH];
	
	wsprintf(szSearch, "%s/*", "/archive");
	hFind = FtpFindFirstFile(hFtp,
		szSearch,
		&w32fd,
		INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE,
		0);

	if(hFind == NULL && GetLastError() != ERROR_NO_MORE_FILES)
	{
		// GOTCHA!!
		MessageBeep(-1); Sleep(850);
		return;
	}

	do
	{
	} while(InternetFindNextFile(hFind, &w32fd));

	InternetCloseHandle(hFind);
}

int main(int argc, char* argv[])
{
	const TERM_EVENT_COUNT = 2;
	HANDLE hTermEvents[TERM_EVENT_COUNT] = {
		CreateEvent(NULL, true, false, NULL),
		CreateEvent(NULL, true, false, NULL),
	};

	// kludge here (?)
	// 
	SetEvent(hTermEvents[1]);

	HINTERNET hInet = InternetOpen("HFreq", 
		INTERNET_OPEN_TYPE_PRECONFIG,
		NULL,
		NULL,
		NULL);

	HINTERNET hFtp = InternetConnect(hInet,
		"P7",
		21,
		"user",
		"password",
		INTERNET_SERVICE_FTP,
		0,
		0);

	DWORD dw = 1;
	while(true)
	{
		printf("searchig\r\n");
			findFilesOnFtp(hFtp);
		printf("finished\r\n");
		++dw;

		DWORD dwWaitObj =
			WaitForMultipleObjects(TERM_EVENT_COUNT,
				hTermEvents,
				false,
				400);

		// here I should test range, not single value..
		if(dwWaitObj == WAIT_OBJECT_0)
		{
			printf("Shutting down");
			break;
		}
	}

	InternetCloseHandle(hFtp);
	InternetCloseHandle(hInet);

	return 0;
}

--
Igor Dontsov

P.S.
Сорри за длинный листинг :-(

P.P.S.
Чуть не забыл. Все это происходит под WinXP pro, eng.

Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: private person (2:5020/400)