Показать сообщение отдельно
  #1  
Старый 22.04.2015, 18:49
AlexBerg001 AlexBerg001 вне форума
Прохожий
 
Регистрация: 13.04.2015
Сообщения: 24
Версия Delphi: Delphi 2010
Репутация: 10
По умолчанию Как сделать однопоточный проект многопоточным

В общем считаю нужным создать другую тему, потому как название старой уже совсем не соответствует возникшим вопросам. Написал рабочий однопоточный проект, теперь пытаюсь сделать его многопоточным, прочитал уже кучу инфы, но что-то не выходит у меня. Вроде бы получается создать потоки, но дальше вылетает ошибка "Socket Error. Socket is not connected". Хотя в один поток всё работает отлично. Я так понимаю. что нужно как-то синхронизировать потоки между собой. На данный момент код выглядит так:
Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, sSkinManager, StdCtrls, sButton, ComCtrls, acProgressBar, sMemo,
  sLabel, sEdit, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdHTTP, IdIOHandler, IdIOHandlerSocket, IdIOHandlerStack, IdSSL, IdSSLOpenSSL,
  IdCookieManager, IdIntercept, IdCompressionIntercept, sDialogs, sSpinEdit;

type
  TForm2 = class(TForm)
    sMemo1: TsMemo;
    sButton1: TsButton;
    IdHTTP1: TIdHTTP;
    IdSSLIOHandlerSocketOpenSSL1: TIdSSLIOHandlerSocketOpenSSL;
    sEdit3: TsEdit;
    sLabel3: TsLabel;
    sLabel4: TsLabel;
    sLabel5: TsLabel;
    sMemo2: TsMemo;
    sButton2: TsButton;
    sOpenDialog1: TsOpenDialog;
    sLabel6: TsLabel;
    sLabel7: TsLabel;
    sLabel8: TsLabel;
    sLabel9: TsLabel;
    sSkinManager1: TsSkinManager;
    sProgressBar1: TsProgressBar;
    sButton3: TsButton;
    sSpinEdit1: TsSpinEdit;
    sLabel1: TsLabel;
    procedure sButton1Click(Sender: TObject);
    procedure sButton2Click(Sender: TObject);
    procedure sButton3Click(Sender: TObject);
    { Private declarations }
  public
    { Public declarations }
  end;

type
  TMyThread = class(TThread)
  private
  protected
  procedure WriteFile;
  procedure Good;
  procedure Bad;
  procedure ProgressBar;
  procedure MemoClear;
    procedure Execute; override;
end;


var
  Form2: TForm2;
  Accounts: TStringList;
  Login, Password, del: string;
  ProgressPos: integer;
  T1: TThread;

implementation

{$R *.dfm}


procedure TForm2.sButton2Click(Sender: TObject);
begin
Accounts:=TStringList.Create;
if sOpenDialog1.Execute then
begin
  Accounts.Clear;
  sMemo1.Lines.Clear;
  sMemo2.Lines.Clear;
  Accounts.LoadFromFile(sOpenDialog1.FileName);
  sLabel9.Caption:=inttostr(Accounts.Count);
  end;
if pos(';', Accounts.Strings[0])<>0 then
begin
  del:=';';
end else
begin
del:=':';
 end;
end;


procedure TForm2.sButton3Click(Sender: TObject);
begin
T1.Terminate;
Form2.sProgressBar1.Position:=Accounts.Count;
end;

procedure TForm2.sButton1Click(Sender: TObject);
{var
Threads: integer;
begin
for
Threads:=1  to sSpinEdit1.Value do}
begin
T1:=TMyThread.Create(False);
T1.Priority:=tpLower;
end;
{end;}

procedure TMyThread.MemoClear;
begin
 Form2.sMemo1.Lines.Clear;
 Form2.sMemo2.Lines.Clear;
end;


procedure TMyThread.ProgressBar;
begin
 Form2.sProgressBar1.Position:=ProgressPos+1;
 Form2.sProgressBar1.Max:=Accounts.Count;
end;


procedure TMyThread.Bad;
begin
 Form2.sMemo2.Lines.Add(Login+del+Password);
 Form2.sLabel6.Caption:=inttostr(Form2.sMemo2.Lines.Count);
end;


procedure TMyThread.Good;
begin
 Form2.sMemo1.Lines.Add(Login+del+Password);
 Form2.sLabel7.Caption:=inttostr(Form2.sMemo1.Lines.Count);
end;

procedure TMyThread.WriteFile;
begin
 Form2.sMemo1.Lines.SaveToFile(ExtractFilePath(Application.ExeName) + 'Good.txt');
 Form2.sMemo2.Lines.SaveToFile(ExtractFilePath(Application.ExeName) + 'Bad.txt');
end;




procedure TMyThread.Execute;
  var
  HTML: string;
  Acc: integer;
begin;
Synchronize(MemoClear);
for Acc := 0 to Accounts.Count-1 do
 begin
 if Terminated
 then break;
 ProgressPos:=Acc;
 Synchronize(ProgressBar);
 Login:=copy(Accounts[Acc], 1, pos(del, Accounts[Acc])-1);
 Password:=copy(Accounts[Acc], pos(del, Accounts[Acc])+1, MaxInt);
 HTML:=Form2.IdHTTP1.Get('http://xxxxxx'+Login+'xxxxxx'+Password);
  if pos ('class="xxxxxx"', HTML)<>0 then
  if Form2.sEdit3.Text<>'' then
  begin
   HTML:=Form2.IdHTTP1.Get('https://xxxxxx'+Form2.sEdit3.Text+'xxxxxx');
   if pos ('class="xxxxxx"', HTML)<>0 then
    begin
     Synchronize(Bad);
    end
    else
    begin
     Synchronize(Good);
    end
  end
  else
  begin
     Synchronize(Good);
  end
else
begin
Synchronize(Bad);
end;
Synchronize(WriteFile);
end;

end;


end.
Ответить с цитированием