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)