Задать вопрос
@libera

Многопоточная программа?

Уже 2 сутки не могу понять как сделать.
Подскажите

Вызываю поток
procedure TForm1.btn1Click(Sender: TObject);
var
  I: Integer;
begin
for I := 0 to se1.Value do
  text:=proba.Create(False);
  text.Priority:=tpNormal;
end;
 
end.

в потоке
procedure Proba.Execute;
begin
  n1;
end;
 
procedure Proba.n1;
var
  I: Integer;
  s,a:string;
begin
  for I := 0 to 5 do
    begin
      s:=form1.mmo1.Lines.Strings[i];
      Form1.mmo2.Lines.Add(s);
      Sleep(1000);
    end;
 
end;


end.
В se1 записываю пример 5 потоков это кнопка TSpinEdit;
Все работает, но я думаю не так.
Он выполняет все по 5 раз, а именно
1
2
3
4
5
Перенести в 2 memo
А он тупо одинаково все выполняет
1
1
1
1
1
2
2
2
и .д.
А мне надо, что бы он создал 5 потоков, с разными данными
1/2/3/4/5
Во 2 потоке 2
В 3 потоке 3 ну и т.д.

Подскажите как так сделать? Что бы он не попировал потоки и выполнял, а создавал 5 разных потоков с разными переменными
  • Вопрос задан
  • 80 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@VZVZ
Reverse-Engineer, Software Developer, Architect
Нужно в классе Proba сделать поле или свойство, ну и в каждый поток передавать переменную со своим значением, ну а уже в самом потоке от нее и отталкиваться.
Достаточно элементарных знаний ООП и алгоритмики, чтобы догадаться до этого и реализовать.

Но 1/2/3/4/5 - не получится уж точно. Потоки выполняются не совсем параллельно, а псевдопараллельно, винда переключается от одного к другому, так что последовательность строк в Memo будет хаотичной. И чем больше потоков и чем меньше ядер у проца, тем хаотичнее.
Ответ написан
Комментировать
@iandarken
1. Ты создаешь se1.Value + 1 поток, каждый из которых выполняет твой 0..5 цикл в Proba.n1. Соответственно, у тебя и пишется в memo пять единици от каждого из потоков, потом 2 - снова от каждого из потоков. Твоя I из for I := 0 to 5 do - не общая для всех потоков, а своя для каждого. Если нужен аналог глобальной переменной, добавь в описание класса Proba static-поле, вроде
private
class function GetStaticField: string; static;
class procedure SetStaticField(const Value: string); static;
public
class property StaticField: string read GetStaticField write SetStaticField


2. Но это все фигня. Самое страшное тут:

Form1.mmo2.Lines.Add(s);

за изменение GUI-компонентов не через Synchronize вообще канделябром можно получить в самом неожиданном месте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы