Здраствуйте, пишу программу с многопоточностью, когда ее запускаю с одним потоком, все отлично, но если больше выдает ошибку, подскажите где я ошибся. Вот код PHP: TNewThread = class(TThread) private protected procedure Execute; override; public procedure Sync; constructor Create(CreateSuspended: Boolean); end; ....... procedure TForm1.Button1Click(Sender: TObject); begin Work:=true; for Thread:=1 to strtoint(Edit1.Text) do TNewThread.Create(false); Thread:=strtoint(Edit1.Text); end; procedure TNewThread.Execute; var HTTP: TIdHTTP; i,g, mes, mec, ifk:integer; url, url1, res1:string; begin while Work do begin mes:= form1.memo1.lines.Count; mec:=0; ifk:=0; while mec<>mes do begin url:=form1.memo1.lines[mec]; res:=form1.idhttp1.get(url); res:=Utf8ToAnsi(res); res1:=res ; g:=pos('<li><span>...</span></li>',res1); delete(res1,1,g+25); g:=pos('">',res1); delete(res1,1,g+1); i:=length(res1); g:=pos('</a>',res1); delete(res1,g,i); i:=1; while i<>strtoint(res1)+1 do begin form1.Label1.Caption:='Парсинг....'; while (pos('<div class="h3"><a href="',res)<>0) do begin delete(res,1,pos('<div class="h3"><a href="',res)+25); form1.ListBox1.Items.Add(copy(res,1,pos('"',res)-1)); form1.ListBox1.TopIndex:=form1.ListBox1.Items.Count-1; ifk:=ifk+1; form1.Label2.Caption:='Спарсено инфы: '+inttostr(ifk); end; i:=i+1; url1:=url+'page'+inttostr(i)+'/';; res:=form1.idhttp1.get(url); res:=Utf8ToAnsi(res); end; mec:=mec+1; end; form1.Label1.Caption:='Готово.'; form1.Button2.Enabled:=true; end; dec(Thread); if Thread=0 then ShowMessage('OK'); end; constructor TNewThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); end; При нажатии на бутон выдает такую ошибку: И выделяет: Зарание спасибо.
Все сделал как написано выше, вроде работает, но через некоторое время выскочила такая ошибка: и выделяет строку:
программа должна добавить к урл текст: "page", и и цифру, но почемуто цифра не увеличивается, постоянно парсит одну и туже страницу =(
а... у него "Canvas does not allow Drawing" Это попытка рисовать из потока (label.caption, ShowMessage, etc..)
проблема с синхронизацией у тебя, инфа 99%, вполне возможно, что N разных потоков в один момент обращаются к одним общим объектам, как например: почитайте про TCriticalSection
при використанні потоків забудь про компоненти на формі! якщо тобі щось потрібно то зроби копію цього ’чогось’ для кожного потоку
Code: TNewThread = class (TThread) private FParam1,FParam2:integer; protected procedure Execute; override; public constructor Create(Param1,Param2:integer); property Param1:integer read FParam1 write FParam1; property Param2:integer read FParam2 write FParam2; end; constructor TNewThread.Create(Param1,Pararm2:integer); begin inherited Create(False); FParam1:=Param1; FParam2:=Param2; FreeOnTerminate:=true; end; procedure TNewThread.Execute; override; var MyObject:TMyObject; begin MyObject:=TMyObject.Create; try MyObject.MyMethod(FParam1); finaly MyObject.Free; end; end; begin TNewThread.Create(1,2); //або with TNewThread.Create(True) do begin Param1:=1; Param2:=2; FreeOnTerminate:=true; end; end;
ну я би то інакше робив... але можна так (Delphi 2009+) Code: Synhronize(procedure begin mes:= form1.memo1.lines.Count end); старайся зробити потік як можна більш автономним... (якщо можна то зроби так - ти йому вхідні дані, а він тобі вихідні)