Где-то тухнут потоки при проходе цикла. Не могу доглядеть PHP: unit Unit2; interface uses Classes,unit1,IdHTTP,SyncObjs; type Thrd = class(TThread) private CurrAcc: String; Stmp: String; protected procedure Execute; override; procedure UpdMemo2; procedure UpdMemo3; procedure UpdMemo4; end; implementation var DoWork: Boolean = True; procedure thrd.UpdMemo2; begin Form1.Memo2.Lines.Add(CurrAcc); end; procedure thrd.UpdMemo3; begin Form1.Memo3.Lines.Add(CurrAcc); end; procedure thrd.UpdMemo4; begin Form1.Memo4.Lines.Add(CurrAcc); end; procedure Thrd.Execute; var HTTP: TIdHTTP; SR: TStringStream; tmp,key: String; i:integer; begin While DoWork = True do begin CS.Enter; try try if Logins.Count <= 0 then exit; CurrAcc := logins[0]; Logins.Delete(0); except end; finally CS.Leave; end; try try HTTP := TIdHTTP.Create(nil); SR := TStringStream.Create(''); HTTP.Get('http://site',SR); HTTP.Disconnect; tmp := Utf8ToAnsi(SR.DataString); except HTTP.Free; SR.Free; Continue; end; finally SR.Free; end; key := Copy(tmp,Pos('key = ',tmp)+19,22); try try tmp := HTTP.Get('http://site&key='+key); HTTP.Disconnect; except end; finally HTTP.Free; end; if Pos('occupied',tmp) <> 0 then Synchronize(UpdMemo3) else if Pos('free',tmp) <> 0 then Synchronize(UpdMemo2) else Synchronize(UpdMemo4); end; end; end.
Code: try HTTP := TIdHTTP.Create(nil); except [COLOR=DarkRed] HTTP.Free; [/COLOR] end; try try [COLOR=DarkRed] tmp := HTTP.Get('http://site&key='+key); [/COLOR] HTTP.Disconnect; except end; finally HTTP.Free; end; Догадался?)
Ну это да, но у меня в обработке continue стоит, по идее программа туда не доходит а начинает новый проход цикла, если возбуждается исключение. Или как?
Вот так должно быть верно, логику программы не менял, только подправил работу с try..except и try...finally Code: procedure Thrd.Execute; var sr: TStringStream; tmp, key: String; i: integer; begin while DoWork do begin with CS do Begin Enter; try if (Logins.Count <= 0) then Break; CurrAcc := logins[0]; Logins.Delete(0); finally Leave; end; end; with TIdHTTP.Create(nil) do try sr := TStringStream.Create(''); try try Get('http://site', sr); Disconnect; tmp := Utf8ToAnsi(sr.DataString); except Continue; end; finally sr.Free; end; key := Copy(tmp,Pos('key = ',tmp)+19,22); try tmp := Get('http://site&key='+key); Disconnect; except end; finally Free; end; if Pos('occupied',tmp) <> 0 then Synchronize(UpdMemo3) else if Pos('free',tmp) <> 0 then Synchronize(UpdMemo2) else Synchronize(UpdMemo4); end; end;
получается, что если ошибка при создании, то ты освобождаешь то, что не создалось вообще, и потом ещё раз освобождаешь то чего нет. В этом отношение синапс грамотней сделан. Если запрос не прошёл или ошибка произошла, то он просто значение false возвращает. И нет необходимости так часто впихивать исключения, достаточно поставить цикл. вот так бы выглядел запрос на синапсе: Code: repeat http.headers.clear; http.document.clear; {что - то присваиваем} until http.httpmethod('GET{или POST}',http://achat.com/); При таком построение, никогда не выбьет поток, да и никогда не пропустит никакой запрос.
Грамотней, не грамотней - дело не в этом. Если правильно обрабатывать исключения, тогда все правильно будет работать.
Нет, индеец вполне себе компонент, но нормальную работу прокси, я на нём сколько пытался так и не сделал. А вот на synapse с пол пинка. Но есть и свои минусы конечно. Всё нужно в ручную чистить. POST запросы чуть сложнее формировать. Но всё окупается отсутствием ошибок и ещё кучей приятных мелочей. Я не хочу агитировать, но придерживаюсь правила - "Критикуя - предлагай!".
Ну не знаю, на счет прокси. Да, версия Indy которая стояла по умолчанию в Delphi 7 была чудовищна, приходилось фиксить просто кучу всего. Перешел на Delphi XE, все устраивает, достаточно годно. А вот на счет исключений, тут да...в более менее серьезном проекте обработка одних только всевозможных исключений Indy тянет не на одну сотню строк.