подвисает wininet
От: Satell  
Дата: 24.08.07 16:07
Оценка:
вот есть такой код получающий страницы по winnet,
зачастую после вывода строки HttpOpenRequest Successfull перед функцией HttpSendRequest программа подвисает на
несколько минут, либо очень надолго, можно ли сделать какой-нибудь таймаут для этих ф-й или как можно получать
страницу с таймаутом?

char* getpage(char* userag,char* proxy, char* url, char* document, char* referer)
{
    char  szData[1500];
    DWORD dwBytesRead;
    
    HINTERNET hInternet = ::InternetOpen(userag, INTERNET_OPEN_TYPE_PROXY, proxy,NULL,0);
    

    if (hInternet != NULL) 
    {
        puts("internetOpen successfull");
        
        HINTERNET hConnect =::InternetConnect(hInternet, url, INTERNET_DEFAULT_HTTP_PORT, NULL,NULL, INTERNET_SERVICE_HTTP,0,1u);

        if (hConnect != NULL) {
                puts("internetConnect successfull");
            
                HINTERNET hRequest =::HttpOpenRequest(hConnect, TEXT("GET"), document, NULL, referer, 0, INTERNET_FLAG_KEEP_CONNECTION, 1);

            if (hRequest != NULL) {
                    puts("HttpOpenRequest successfull");
        //вот тут подвисает иногда!!!                    BOOL bSend = ::HttpSendRequest(hRequest, NULL,0, NULL,0);
                if (bSend) {
                    puts("httpSendRequest successfull");
                    
                    BOOL bRead = ::InternetReadFile(hRequest, szData,sizeof(szData)-1, &dwBytesRead);
                    if (bRead == FALSE  ||  dwBytesRead == 0)
                    {
                        puts("error readFile");
                        return 0;
                    }
                    
                    szData[dwBytesRead] = 0;
                    return szData;
                }

                
                ::InternetCloseHandle(hRequest);
            }

        
            ::InternetCloseHandle(hConnect);
        }
        
        /
        ::InternetCloseHandle(hInternet);
    }


return 0;
}


у меня там ещё таймер есть, а getpage вызвается из обработчика события таймера в цикле, что тогда конкретно в потоке запускать? может есть где простой иходничек работы с потоками? а что происходит в том случае, если код в потоках ещё не отпработал, а наступает следующее событие таймера, например код в каком-то потоке не может получить страницу и подвис, этот код уничтожется или эти недоработавшие потоки будут висеть где-то в памяти?
а сам по себе таймер не создает отдельные потоки случайно?

int CALLBACK TimerProc(void)
{

for (int j=0; j<numsites; j++)
{

//поток должен создаваться гдето тут?!!!
pagedata=getpage(...);
//действия с pagedata

//ещё два раза
getpage(...);
getpage(...);
//поток должен заканчиваться гдето тут!!!

}

}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.