| Цитата(XperT @ 27.4.2012, 12:15) | Немного критики (в образовательных целях):
| Код | cs0.Enter; Synchronize(UpdateThreads); cs0.Leave;
|
В данном случае использование критических секций лишнее, так как функция UpdateThreads будет выполнена в основном потоке и каждый поток, который дойдёт до выполнения этого кода и так будет ждать, пока предыдущий завершит работу.
К тому же, настоятельно рекомендую использовать критические секции вместе с конструкцией try...finaly, иначе, если вылетит где-то ошибка между открытием и закрытием критической секции, то все потоки подвиснут.
В остальном, если не считать выравнивания кода, всё вроде нормально. |
ЭТо тоже заметил, и пофиксил - где заметил:
| Код | procedure TCheckThread.Execute; var curitem: integer; begin InterlockedIncrement(threads_alive); cs0.Enter; Synchronize(UpdateThreads); cs0.Leave; while Work do begin if item<ProxyList.Count then curitem:=item else work:= false; //for i:= 0 to (ProxyList.Count - 1) do if Work = true then begin // i:=i+1; cs0.Enter; str:= ProxyList.Strings[item]; inc(item); cs0.Leave; // synchronize(); ip:=copy(str,0,pos(':',str)-1); port:=copy(str,pos(':',str)+1,length(str)-pos(':',str)); {if in the end of the line there are spaces - remove them} while pos(' ',port)<>0 do setlength(port,length(port)-1); {create socket} s:=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); FillChar(addr, SizeOf(sockaddr_in), 0); addr.sin_family:=AF_Inet; addr.sin_port:=htons(strtoint(port)); addr.sin_addr.S_addr:=inet_addr(PAnsiChar(ip)); {connect} Connect(S,addr,SizeOf(TSockAddr)); //sendbuff := 'GET / HTTP/1.1'+ #13#10 + //'Host: ya.ru'+ #13#10#13#10; sendbuff:='GET / HTTP/1.1'+ #13#10 + 'User-Agent: Opera/9.80 (Windows NT 6.1; U; ru) Presto/2.10.229 Version/11.62'+ #13#10+ 'Host: ya.ru'+ #13#10 + 'Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1' + #13#10+ 'Accept-Language: ru-RU,ru;q=0.9,en;q=0.8'+ #13#10 + 'Accept-Encoding: gzip, deflate'+ #13#10 + 'Connection: Keep-Alive'+ #13#10; {send query} // CopyMemory(@sbuff,PAnsiChar(sendbuff),length(sendbuff)); // send(s,sbuff,length(sbuff),0); send(s, sendbuff[1] , Length(sendbuff), 0); {read answer} reply:=recvdata(s); //recv(s,rbuff,length(rbuff),0); {close socket} // reply(rbuff); // SetString(reply,Pchar(@rbuff),length(rbuff)); closesocket(s); synchronize(UpdateCounters); {If the answer is the correct line to us - we finish the list of "good" ip and port used by proxy (using a critical section)} if pos('Set-Cookie',reply)<>0 then begin cs1.Enter; g:=g+1; append(good); writeln(good,ip+':'+port); try closefile(good); finally; synchronize(initcounters); end; cs1.Leave; end; end; {reduce the count of unfinished (active) threads at 1} end; InterlockedDecrement(threads_alive); Synchronize(UpdateThreads); end;
|
|