Po6oKon 177 Опубликовано 11 июня, 2015 Есть на дельфине кусок кода такой программы, тут проблема с потоками, с ними я сейчас учусь работать, никто не подскажет где может содержаться ошибка? По идее в label должны выводится значения и пуск GET Запросов, GET запросы как бы идут, но label не хочет работать и потоки все зависают. TNewThread = class(TThread) private FAcc:string; FPas:string; rez:integer; protected procedure Execute; override; public procedure Sync; constructor Create(CreateSuspended: Boolean); end; var Form1: TForm1; accounts, result:tstrings; HTTP:TIdHTTP; PublicFile, PrivateFile: textfile; CS:TcriticalSection; acc, thread:integer; work:boolean; json: Isuperobject; login, apikey: string; implementation {$R *.dfm} procedure TForm1.FormShow(Sender: TObject); var http:thttpsend; begin HTTP:=THTTPsend.Create; result:=tstringlist.Create; if HTTP.HTTPMethod('GET', 'http://androided.hostoi.com/al.php') then begin result.LoadFromStream(HTTP.Document); json:=SO(result.Text); sLabel8.Caption:=json.S['count_lines']; end; http.Free; result.Free; end; procedure TForm1.sButton1Click(Sender: TObject); begin if sOpenDialog1.Execute then begin accounts.Clear; accounts.LoadFromFile(sOpenDialog1.FileName); sLabel4.Caption:=inttostr(accounts.Count); end; end; procedure TForm1.sButton2Click(Sender: TObject); begin AssignFile(PublicFile, ExtractFilePath(Application.ExeName)+'public.txt'); Rewrite(PublicFile); CloseFile(PublicFile); AssignFile(PrivateFile, ExtractFilePath(Application.ExeName)+'private.txt'); Rewrite(PrivateFile); CloseFile(PrivateFile); sLabel5.Caption:='0'; sLabel6.Caption:='0'; Acc:=-1; Work:=True; sButton2.Enabled:=False; sButton3.Enabled:=True; sButton1.Enabled:=False; sCheckBox1.Enabled:=False; for Thread := 1 to 5 do TNewThread.Create(false); Thread:=5; end; procedure TForm1.sButton3Click(Sender: TObject); begin Work:=False; end; constructor TNewThread.Create(CreateSuspended: Boolean); begin inherited Create(CreateSuspended); end; procedure TNewThread.Execute; var CurAcc:integer; HTTP: TIdHTTP; result, param:string; begin while Work do begin CS.Enter; Inc(Acc); if Acc<Accounts.Count then CurAcc:=Acc else Work:=false; CS.Leave; if Work then begin HTTP:=TIdHTTP.create(nil); //Создаём HTTP HTTP.HandleRedirects:=false; //Запрещаем редирект if Pos(';', Accounts[CurAcc])>0 then begin FAcc:= Copy(Accounts[CurAcc],1,Pos(';',Accounts[CurAcc])-1); //Копируем логин FPas:= Copy(Accounts[CurAcc],Pos(';',Accounts[CurAcc])+1,Length(Accounts[CurAcc])); //Копируем пароль end else if Pos(':', Accounts[CurAcc])>0 then begin FAcc:= Copy(Accounts[CurAcc],1,Pos(':',Accounts[CurAcc])-1); //Копируем логин FPas:= Copy(Accounts[CurAcc],Pos(':',Accounts[CurAcc])+1,Length(Accounts[CurAcc])); //Копируем пароль end else if Pos('|', Accounts[CurAcc])>0 then begin FAcc:= Copy(Accounts[CurAcc],1,Pos('|', Accounts[CurAcc])-1); //Копируем логин FPas:= Copy(Accounts[CurAcc],Pos('|',Accounts[CurAcc])+1,Length(Accounts[CurAcc])); //Копируем пароль end; try result:=HTTP.GET('http://androided.hostoi.com/bd.php?mail='+FAcc+'&pass='+FPas); json:=SO(result); if json.S['PUBLIC']='PUBLIC' then Rez:=-1 else if json.S['PRIVATE']='PRIVATE' then Rez:=1; except Rez:=-1; end; HTTP.Free; //УБиваем HTTP Synchronize(Sync); //Делаем синхронизацию. Самая важная строка! end; end; dec(Thread); if Thread=0 then begin ShowMessage('OK'); //No comments... Form1.sButton2.Enabled:=True; Form1.sButton3.Enabled:=False; Form1.sButton1.Enabled:=True; Form1.sCheckBox1.Enabled:=True; end; end; procedure TNewThread.Sync; begin case Rez of 0:begin Accounts.Add(FAcc+';'+FPas); end; 1:begin Append(PrivateFile); Writeln(PrivateFile,FAcc+';'+FPas); Closefile(PrivateFile); Form1.sLabel6.Caption:=IntToStr(StrToInt(Form1.slabel6.Caption)+1); end; -1:begin Append(PublicFile); Writeln(PublicFile,FAcc+';'+FPas); Closefile(PublicFile); Form1.slabel5.Caption:=IntToStr(StrToInt(Form1.slabel5.Caption)+1); end; end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin work:=false; Accounts.Free; CS.Free; end; procedure TForm1.FormCreate(Sender: TObject); begin Accounts:=Tstringlist.create; CS:=TcriticalSection.create; login:=''; apikey:=''; end; end. Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты