![]() |
подвисает wininet
вот есть такой код получающий страницы по winnet,
зачастую после вывода строки HttpOpenRequest Successfull перед функцией HttpSendRequest программа подвисает на несколько минут, либо очень надолго, можно ли сделать какой-нибудь таймаут для этих ф-й или как можно получать страницу с таймаутом? Код:
char* getpage(char* userag,char* proxy, char* url, char* document, char* referer) |
как запихать ёё в отдельный поток?
|
1) Делай структуру, содержащую из:
char* userag, char* proxy, char* url, char* document, char* referer 2) Заполни эту структуру 3) Создавай поток и передавай указатель на эту структуру (см. CreateThread) |
у меня там ещё таймер есть, а getpage вызвается из обработчика события таймера в цикле, что тогда конкретно в потоке запускать? может есть где простой иходничек работы с потоками? а что происходит в том случае, если код в потоках ещё не отпработал, а наступает следующее событие таймера, например код в каком-то потоке не может получить страницу и подвис, этот код уничтожется или эти недоработавшие потоки будут висеть где-то в памяти?
а сам по себе таймер не создает отдельные потоки случайно? int CALLBACK TimerProc(void) { for (int j=0; j<numsites; j++) { //поток должен создаваться гдето тут?!!! pagedata=getpage(...); //действия с pagedata //ещё два раза getpage(...); getpage(...); //поток должен заканчиваться гдето тут!!! } } |
Цитата:
Цитата:
|
делаю потоки таким образом с таймаутом 5 сек, виснуть перестало, но иногда возникает такое, что пропадает связь на модеме (нельзя открыть ничего в броузере) и все идет в таймаут "Can not connect to server" ровно раз в 5 сек, пока не завершишь программу, перегрузка какая-то чтоли, по идее все потоки должны завершаться через 5 сек, всё ли правильно в программе? а как сделать чтобы потоки работали параллельно несколько или они и так работают, но почему тогда puts(pThreadParm->url); выводит ровно раз в 5 сек...
Код:
DWORD WINAPI WorkerFunction( LPVOID ); |
в WorkerFunction вызывается getpage (см. первое сообщение), которая часто подвешивается, WaitForSingleObject ждёт 5 сек и потом по идее должна завершать поток, я думал это делает CloseHandle (hThread), но она этого не делает!!! копиться много потоков, пока не сожрут все ресурсы системы, как грамотно завершить поток?
Код:
if ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT ) |
HINTERNET hInternet;
HINTERNET hConnect; HINTERNET hRequest; объявляю глобально потом Код:
if ( WaitForSingleObject ( hThread, dwTimeout ) == WAIT_TIMEOUT )виснет похоже HttpSendRequest и как повиснет так вместе с потоком и висит и ничего с ней не поделаешь, а если не ждать WaitForSingleObject ( hThread, INFINITE ); тогда число потоков постоянно растет... почему никто не придумал таймауты для ф-й winapi? |
Люди, ну вы хотябы прежде чем писать многопоточные приложения, прочитайте про эту самую многопоточность.
Цитата:
Надеюсь хоть что-то прояснишь для себя. |
ну да я жду тут пока поток завершиться, а он не завершается, виснет ф-я HttpSendrequest и висит вместе с потоком, так их накапливается очень много, если не ждать
|
| Время: 01:16 |