По результату видно, что есть повторения. Выполнение цикла почему-то не до трех!? Бывает что цикл выполняется несколько раз. Например, если потоков десять, может выполнится десять раз. Кодеры объясните что к чему!
Что ж тут объяснять то. При использовании многопоточности необходимо синхронизировать работу потоков
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Так не интересно. Подскажу:
1) Не используй цикл for в потоке
2) Засунь инкремент в процедуру синхронизации
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
procedure potok.Execute;//начинаем описывать главную процедуру потока
var
I:integer;
begin
for i:=0 to 100 do
begin
sleep(1000);
synchronize(synchro);//этой строкой мы вызываем процедуру synchro в единичном экземпляре
end;
end;
Многопоточность? Простой цикл,в котором потоки роли не играют(кроме первого создавшегося).
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ComCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
UpDown1: TUpDown;
potoki: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
potok = class(TThread)
protected
procedure meniala;
procedure Execute; override;
end;
var
a: array [1..9999999] of potok;
Form1: TForm1;
nom: Integer=0;
implementation
{$R *.dfm}
procedure potok.Execute;
begin
Synchronize(meniala);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i:=1 to updown1.position do
a[i]:=potok.Create(false);
end;
Procedure potok.meniala;
begin
Sleep(1000);
nom:=nom+1;
form1.Caption:= inttostr(nom);
form1.potoki.lines.add(inttostr(nom));
end;
end
Это многопоточность.
________________
[Ссылки могут видеть только зарегистрированные пользователи. ]
Код изображений не разрешен.
Последний раз редактировалось ~MaXиK~; 01.05.2013 в 19:20.
Причина: Опечатка.
а как к каждому потоку привязать прокси из списка так, чтобы они не повторялись? => случайный выбор прокси-плохая идея.
Ну по очереди из списка дёргать, пропатчив стандартную функцию TThread - Create.
________________
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
Принимаются пожертвования любых размеров в фонд поддержки начинающих программистов
Кошельки: WMZ - Z276844220882; WMR - R231028582939; WMU - U394136909210; ЯД - 410011494605270.
А вы в курсе, что Synchronize стопает все потоки на время запуска метода, указанного в нем?
Если потоков 1-10, то это не сильно влияет на работоспособность. А есть 100-1000? Каждый из потоков атомарно будет больше простаивать, чем работать, т.к., еще раз повторяю, пока 1 поток синхронизируется, остальные 999 его ждут.
Наилучшим способом, будет сделать какой-либо невизуальный класс, и обернуть "многопоточные" методы в CriticalSection.
Если уж надо синхронизировать данные с VCL, то PostMessage и SendMessage.
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
UpDown1: TUpDown;
potoki: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
potok = class(TThread)
protected
procedure meniala;
procedure Execute; override;
end;
var
a: array [1..9999999] of potok;
Form1: TForm1;
nom: Integer=0;
implementation
{$R *.dfm}
procedure potok.Execute;
begin
Synchronize(meniala);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i:=1 to updown1.position do
a[i]:=potok.Create(false);
end;
Procedure potok.meniala;
begin
Sleep(1000);
nom:=nom+1;
form1.Caption:= inttostr(nom);
form1.potoki.lines.add(inttostr(nom));
end;
end.
[/CODE]
В чем смысл создавать поток, если ваш поток ничего не делает, как выполняет метод Procedure potok.meniala; в общем потоке? - то бишь, как-будто потока и нет.
Добавлено через 15 минут
Цитата:
Сообщение от avi2011class
а как к каждому потоку привязать прокси из списка так, чтобы они не повторялись? => случайный выбор прокси-плохая идея.
примерно так:
PHP код:
uses SysUtils, Classes, SyncObjs;
TProxyList = class
protected
FList: TStrings;
FIndex: Integer;
FSync: TCriticalSection;
function GetHost: string;
function GetPort: string;
public
constructor Create; virtual;
destructor Destroy; override;