|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
idHTTP.Get и многопоточность
есть программа, которая берёт строку из текстового файла и на основе её переходит по ссылке IdHTTP.Get. пытаюсь реализовать многопоточность, но никак не выходит почему-то потоки (сколько бы я их не задавал) за секунду убиваются до 1... и ещё другая проблема, как сделать так, чтобы потоки при работе с текстовым файлом распределили между собой строки, тем самым повышая производительность? а не обрабатывали все вместе одну и ту же. заранее благодарен
вот код юнита с потоком: Код:
type TMyThread = class(TThread) private s,smod:string; i:integer; protected procedure ShowResult; procedure ThreadExit(Sender : TObject); procedure Execute; override; public constructor Create; overload; constructor TMyThread.Create; begin Create(true); Inc(alive); Priority:=tpHigher; OnTerminate:=ThreadExit; Resume; end; procedure TMyThread.ThreadExit(Sender: TObject); begin dec(alive); end; procedure TMyThread.Execute; begin assignfile(f,path); reset(f); assignfile(f1,extractfilepath(path)+'1.txt'); rewrite(f1); repeat while not eof(f) do begin readln(f,s); login:=copy(s,1,pos('@',s)-1); domain:=copy(s,pos('@',s)+1,length(s)); delete(domain,pos('.',domain),3); code:=Form1.IdHTTP1.Get('http://my.mail.ru/'+domain+'/'+login+'/'); //опущу часть кода Synchronize(ShowResult); end; until Terminated; closefile(f); closefile(f1); for tr:=0 to n-1 do begin MyThread[i].Terminate; Synchronize(ShowResult); end; end; и вот код главного юнита: Код:
var alive,n,q:integer; MyThread:array of TMyThread; procedure TForm1.Button1Click(Sender: TObject); begin n:=10; setlength(mythread,n); for q:=0 to n-1 do MyThread[q]:=TMyThread.Create; end; |
#2
|
|||
|
|||
Потому что делается это не так.
У тебя поток обрабатывает 1 ссылку. Соответсвенно, тебе надо эту ссылку потоку передавать извне. Код:
// Поток type TMyThread = class(TThread) private FURL : String; ... public constructor Create(CreateSuspended : Boolean; AURL : String); ... constructor TMyThread.Create(CreateSuspended : Boolean; AURL : String); begin inherited Create(CreateSuspended); FURL := AURL; ... end; // Вызов потоков procedure TForm1.Button1Click(Sender: TObject); var I : Integer; L : TStringList; A : Array Of TMyThread; begin L := TStreingList.Create; L.LoadFromFile('urls.txt'); SetLength(A,L.Count); For I := 0 To L.count-1 Do A[i]:=TMyThread.Create(False,L[i]); L.Free; end; |
#3
|
|||
|
|||
с этим кодом я почти разобрался... вот только не пойму как переписать мой Execute для такого...(
и если оставить организацию счётчика активных потоков в переменной alive (как у меня) будет ли она верно их показывать? или стоит что-то переделать тоже? Последний раз редактировалось srubill, 22.08.2010 в 00:06. |