powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / подвисает wininet
8 сообщений из 8, страница 1 из 1
подвисает wininet
    #34752116
Satell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот есть такой код получающий страницы по winnet,
зачастую после вывода строки HttpOpenRequest Successfull перед функцией HttpSendRequest программа подвисает на
несколько минут, либо очень надолго, можно ли сделать какой-нибудь таймаут для этих ф-й или как можно получать
страницу с таймаутом?

Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
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 вызвается из обработчика события таймера в цикле, что тогда конкретно в потоке запускать? может есть где простой иходничек работы с потоками? а что происходит в том случае, если код в потоках ещё не отпработал, а наступает следующее событие таймера, например код в каком-то потоке не может получить страницу и подвис, этот код уничтожется или эти недоработавшие потоки будут висеть где-то в памяти?
а сам по себе таймер не создает отдельные потоки случайно?

Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
int CALLBACK TimerProc(void)
{

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

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

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

}

} 
...
Рейтинг: 0 / 0
подвисает wininet
    #34752260
__гость__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1) Если timer callback-функция затянется (что у вас сейчас), вы будете или пропускать события, или они будут копиться в очереди (не помню точно), и то и другое плохо. Если потоки будут в цикле, который в таймере, то если таймер у вас будет чаще срабатывать, чем потоки успевают отрабатывать, то количество потоков будет постоянно расти. Потоки будут исполняться(ждать) пока не произойдет выход из их функции или их принудительно не завершат извне.
2) таймер насколько я помню другой механизм использует - APC
3) а для определения что происходит при коннектах, запросах и т.д., и почему висит, можно использовать вот это

Если не секрет, зачем такая архитектура (с таймером)? Поищите в гугле про многопоточную модель-конвейер, она вам тут в самый раз.
...
Рейтинг: 0 / 0
подвисает wininet
    #34752291
Satell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
программа висит в памяти и периодически запрашивает информацию с определённых страниц, а что можно сделать как-то без таймера?
...
Рейтинг: 0 / 0
подвисает wininet
    #34752701
__гость__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
легко можно (даже нужно) без таймера, например, с помощью Sleep или функций ожидания. Какой период таймера?
...
Рейтинг: 0 / 0
подвисает wininet
    #34766258
Satell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
делаю потоки таким образом с таймаутом 5 сек, виснуть перестало, но иногда возникает такое, что пропадает связь на модеме (нельзя открыть ничего в броузере) и все идет в таймаут "Can not connect to server" ровно раз в 5 сек, пока не завершишь программу, перегрузка какая-то чтоли, по идее все потоки должны завершаться через 5 сек, всё ли правильно в программе? а как сделать чтобы потоки работали параллельно несколько или они и так работают, но почему тогда puts(pThreadParm->url); выводит ровно раз в 5 сек...

Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
DWORD WINAPI WorkerFunction( LPVOID );

typedef struct
{
       char* url;
	...структура данных для рабочей функции
} PARM;

int num=0;

DWORD WINAPI WorkerFunction(IN LPVOID vThreadParm)
//vThreadParm - points to PARM passed to thread
{
       PARM* pThreadParm;
       // Initialize local pointer to void pointer passed to thread
       pThreadParm = (PARM*)vThreadParm;
       
       ...тут обрабатывающий код
      puts(pThreadParm->url);

       return 0;
}


int main(int argc, char* argv[])
{
DWORD   dwTimeout;
PARM    threadParm;

HANDLE   hThread; 
DWORD    dwThreadID;


for (int j=0; j<num; j++)
{
hThread = CreateThread(
                     NULL,            // Pointer to thread security attributes 
                     0,               // Initial thread stack size, in bytes 
                     WorkerFunction,  // Pointer to thread function 
                     &threadParm,     // The argument for the new thread
                     0,               // Creation flags 
                     &dwThreadID      // Pointer to returned thread identifier 
                 );    

dwTimeout = 5000; // in milliseconds

if ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )
{
           cout << "Can not connect to server";
}

CloseHandle (hThread);
}
}

...
Рейтинг: 0 / 0
подвисает wininet
    #34767084
Satell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в WorkerFunction вызывается getpage (см. первое сообщение), которая часто подвешивается, WaitForSingleObject ждёт 5 сек и потом по идее должна завершать поток, я думал это делает CloseHandle (hThread), но она этого не делает!!! копиться много потоков, пока не сожрут все ресурсы системы, как грамотно завершить поток?

Код:
1.
2.
3.
4.
5.
6.
7.
8.
if ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )
{
           cout << "Can not connect to server";
           ExitThread(dwThreadID);       //при её использование тут программа просто виснет
           TerminateThread(hThread,0); // говорят некорректно освобождает ресурсы, в общем все ресурсы системы все равно сжираются, 
хотя потоков кажется меньше создаётся
                                              
} 
...
Рейтинг: 0 / 0
подвисает wininet
    #34769262
Satell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
программа должна быстро коннектица к большому числу url
Как избавиться от зависания InternetOpenUrl или HttpSendRequest? зависает похоже на 5 мин, при недоступности сервера, таймаут этот гдето в настройках броузера, поменять его нельзя, закрытие описателей winapi ф-й в таймауте выполнения потока не помогает, если убивать потоки TerminateThread, то потом интернет ломается, нет связи, видимо не освобождаются какие-то ресурсы так, если забивать на зависшие потоки, то потом их становится очень много и опять же интернет ломается
...
Рейтинг: 0 / 0
подвисает wininet
    #34769397
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Satellпрограмма должна быстро коннектица к большому числу url
Не используй wininet. Лучше просто открывай сокет, коннекться к удаленому серверу на 80-ый порт, посылай туда GET и получай свою страничку. Намного проще, надежней и удобней будет.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / подвисает wininet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]