
22.04.2015, 18:49
|
Прохожий
|
|
Регистрация: 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.
|