Почему эта программа в многопоточном режиме выдаёт за гуды не гуды, а так же стопрится каждые 2 секунды?

Компьютеры программирование программы проблема Delphi

Никак не могу понять. Возможно я нуб.

Весь проект:
http://rghost.ru/54345553

unit Unit6;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, clipbrd, syncobjs, idhttp, strutils,
Vcl.ExtDlgs;

type
TForm6 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Label1: TLabel;
Button2: TButton;
Label2: TLabel;
OpenDialog1: TOpenDialog;
Button3: TButton;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
potok = class(TThread)
private
procedure sync;
constructor Create(CreateSuspended: Boolean);
{ Private declarations }
protected
procedure Execute; override;
end;

var
Form6: TForm6;
bt,t,i,o,good: integer;
cs: tcriticalsection;
j: string;
st: tstringlist;
html,s: string;

implementation

constructor potok.Create(CreateSuspended: Boolean);
begin
inherited Create(CreateSuspended);
freeonterminate:=true;
end;

{$R *.dfm}

procedure TForm6.Button1Click(Sender: TObject);
var i: integer;
begin
if bt=0 then bt:=1 else bt:=0;
if t=0 then begin
for i:=1 to 100 do potok.create(false);
t:=1;
end;
end;

procedure potok.Execute;
var
http: tidhttp;
begin
http:=tidhttp.Create;
http.HandleRedirects:=true;
while 0=0 do begin
if bt=1 then begin
s:=st[i];
delete(s,pos(';',s),length(s)-pos(';',s)+1);
s:=StringReplace(s,'@','%40',[ rfReplaceAll, rfIgnoreCase ]);
html:=http.Get('http://mega-iq.com/best/?search='+s);
synchronize(sync);
end;
cs.Enter;
if i=st.count-1 then begin i:=0; bt:=0; end;
i:=i+bt;
cs.Leave;
end;
end;

procedure TForm6.Button2Click(Sender: TObject);
begin
ClipBoard.astext:=memo1.text;
end;

procedure TForm6.Button3Click(Sender: TObject);
begin
if OpenDialog1.Execute=true then begin
st.LoadFromFile(OpenDialog1.FileName);
form6.label3.caption:='Всего: '+inttostr(st.count);
i:=0;
end;
end;

procedure TForm6.FormCreate(Sender: TObject);
begin
cs:=tcriticalsection.create;
st:=tstringlist.Create;
end;

procedure potok.sync;
begin
if pos('Код результата:',html)<>0 then begin
good:=good+1;
form6.Memo1.Lines.Add(st[i]);
end;
form6.label1.caption:='Проверено: '+inttostr(i+1);
form6.label2.caption:='good: '+inttostr(good);
end;

end.
Ответы:
1) переменная html явно должна быть переменной(полем) потока, иначе её значение во время выполнения sync может быть случайным(присвоенным другим потоком).
2) я так понимаю пытаетесь сделать пул из 100 потоков - можно использовать TThreadList для синхронизации доступа к заданиям
3) while 0=0 do - wtf - while not Terminated do + здесь у вас явное зацикливание - где завершение потоков?
4) где освобождение памяти хотя бы одного объекта?


10 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.