Здравствуйте, подскажите пожалуйста что я делаю не так. Я посылаю гет запрос на сайт через idhttp и через сокс прокси, если прокси не рабочий, то оно конектится 20 сек и потом выдает ошибку, как сделать чтоб конект шел к примеру 5 сек. Я пробувал по разному, Но у меня не выходит (всеравно долго конектится): PHP: timeout:=5000; shost:='111.111.111.111'; sport:=1080; idhttp1.ConnectTimeout:=timeout; idhttp1.ReadTimeout:=timeout; IdIOHandlerStack1.ConnectTimeout:=timeout; IdIOHandlerStack1.ReadTimeout:=timeout; idsocksinfo1.Host:=shost; idsocksinfo1.Port:=sport; idsocksinfo1.Version:=svSocks4; IdIOHandlerStack1.TransparentProxy:=idsocksinfo1; idhttp1.IOHandler:=IdIOHandlerStack1; try http.Get('http://sait.ru'); except showmessage('Error'); end; Очень нужно!!! Зарание спасибо
Попробуй создавать поток и выполнять http.Get в нем. Если ответа не поступило за 5 секунд, то закрывай поток...
как в дополнительном модуле объявлять поток? как его создать(запустить)? И как правельно булет его убить?
примерно так: Code: function getThread(lpParameters: Pointer): DWORD; stdcall; begin ........ // тут код запроса ........ // если все удачно, то возвращаем STATUS_SUCCESS Result:= STATUS_SUCCESS; ........ ExitThread(Result); end; procedure sendGet(timeout: Integer); var lpExitCode: DWORD; hThread: THandle; begin hThread:= CreateThread(nil, 0, @getThread, nil, 0, PDWORD(nil)^); if (hThread <> 0) then try case WaitForSingleObject(hThread, timeout) of WAIT_OBJECT_0: begin GetExitCodeThread(hThread, lpExitCode); // проверяем код завершения потока if lpExitCode = STATUS_SUCCESS then ........ // поток завершился успехом end; WAIT_TIMEOUT: // сработал таймаут TerminateThread(hThread, 0); end; finally CloseHandle(hThread); end; end;
У меня выдает такие ошибки: Code: function getThread(lpParameters: Pointer): DWORD; stdcall; ==> dword ExitThread(Result); ==> ExitThread lpExitCode: DWORD;==> DWORD hThread:= CreateThread(nil, 0, @getThread, nil, 0, PDWORD(nil)^); ==> CreateThread и PDWORD case WaitForSingleObject(hThread, timeout) of WAIT_OBJECT_0: ==> WaitForSingleObject и WAIT_OBJECT_0: GetExitCodeThread(hThread, lpExitCode); ==> GetExitCodeThread Result:= STATUS_SUCCESS; но я так понимаю что нужно сделать тут так: Result:= 'STATUS_SUCCESS';
bertys, судя по ошибкам у тебя windows в uses не прописан, так как все эти типы там определены, STATUS_SUCCESS - это DWORD, а не сторока
ну а загуглить не судьба, а так можно возвращать любое значение в ExitThread(Result); не обязательно STATUS_SUCCESS, хоть 1, 2, 22 - все это будут коды завершения потока, по которым можно обрабатывать ошибки или судить о успешности его выполнения Code: type NT_STATUS = Cardinal; const STATUS_SUCCESS = NT_STATUS($00000000);