Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 19.04.2013, 10:52
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию Многопоточность в программах

Здравствуйте. Не знаю в какой раздел написать, поэтому пишу в этот!
Хочу узнать больше о потоках в делфи, а именно как сделать не один поток к основному, а несколько?
Читал статьи про потоки, но в каждой из них описано как создать один дополнительный поток к основному!
Кому не тяжело объяснить, прошу показать на примере!
Допустим нужно создать программу которая в 100 потоков будет считать до 1 миллиарда с шагом в 0.001! Как реализовать это в 100 потоков?
Ну или пример вашей программы, которая что-то делает в многопоточном режиме!

Последний раз редактировалось MoS, 19.04.2013 в 10:54.
Ответить с цитированием
  #2  
Старый 19.04.2013, 11:13
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

На винграде целый талмуд был по потокам, поищи там.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #3  
Старый 19.04.2013, 11:25
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;  
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Execute;
begin
  // do it
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:=1 to 100 do TMyThread.Create(False);
end;

end.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 19.04.2013, 12:48
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от NumLock
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;  
  end;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Execute;
begin
  // do it
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  for i:=1 to 100 do TMyThread.Create(False);
end;

end.
Спасибо!
Но есть еще вопрос, если в Execute есть:
Код:
for k:=1 to 1000 do
begin
 link:='http://www.-----.ru/page/'+IntToStr(i)+'/';
 data:=Form1.IdHTTP1.Get(link);
end;
то как это сделать в 100 потоков, таким же методом как и выше написано?
Ответить с цитированием
  #5  
Старый 19.04.2013, 13:00
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

В конструктор можно передать строку
Код:
for i := 0 to ... do
  foo := TMyThread.Create('blabla'+inttostr(i));
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Этот пользователь сказал Спасибо M.A.D.M.A.N. за это полезное сообщение:
MoS (19.04.2013)
  #6  
Старый 19.04.2013, 13:27
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

и IdHTTP1 объяви в Execute
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Этот пользователь сказал Спасибо NumLock за это полезное сообщение:
MoS (19.04.2013)
  #7  
Старый 19.04.2013, 20:35
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию

Все пытаюсь разобраться с многопоточностью, вот пример кода, в 2 потока работает, только такое ощущение что в 1 поток (не основной) все работает намного быстрее!
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  Potok = class(TThread)
  private
    h: Extended;
  public
  protected
    procedure Execute; override;
    procedure ShowResult;
  end;

var
  Form1: TForm1;
  pot: Potok;
  
implementation

{$R *.dfm}

{ Potok }
procedure Potok.Execute;
begin
  inherited;
  h:=0;
  while (h<>1000000000) do
  begin
    h:=h+0.001;
    Synchronize(ShowResult);
  end;
end;

procedure Potok.ShowResult;
begin
  Form1.Label3.Caption:=FloatToStr(h);
end;

procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
  for i:=1 to 2 do
  begin
    pot:=Potok.Create(false);
    pot.Priority:=tpNormal;
    pot.FreeOnTerminate:=true;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
begin
  for i:=1 to 2 do pot.Suspend;
end;

end.
Как только ставлю вместо 2-х потоков 3 и более, программа просто виснет и ничего не происходит, в чем проблема, подскажите?
Ответить с цитированием
  #8  
Старый 19.04.2013, 22:08
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Немного оффтоп:
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
  for i:=1 to 2 do
  begin
    pot:=Potok.Create(false);
    pot.Priority:=tpNormal;
    pot.FreeOnTerminate:=true;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
begin
  for i:=1 to 2 do pot.Suspend;
end;
оригинально...
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось lmikle, 20.04.2013 в 02:50.
Ответить с цитированием
  #9  
Старый 19.04.2013, 23:40
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Немного оффтоп:

оригинально...
А что не так? Не понятно в чем ошибка...
Ответить с цитированием
  #10  
Старый 19.04.2013, 23:44
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

А в том, что ты 2 раза записываешь в одну переменную разные значения. Вопрос на засыпку: куда девается первое?
А потом ты пытаешься два раза один и тот же поток остановить. Вопрос: почему?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #11  
Старый 19.04.2013, 23:54
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
А в том, что ты 2 раза записываешь в одну переменную разные значения. Вопрос на засыпку: куда девается первое?
А потом ты пытаешься два раза один и тот же поток остановить. Вопрос: почему?
Ошибка ясна!
Приведите пожалуйста пример кода, вернее исправление моей программы!
Ответить с цитированием
  #12  
Старый 19.04.2013, 23:56
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Сделать массив из потоков, и присваивать в pot[i]. Соответственно, останавливать тоже pot[i]. А на будущее - отказаться от названий классов и переменных в транслитерации. А то будет
Код:
chbayta chetyrebayta := chbayta(_4bayta1);
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 19.04.2013 в 23:58.
Ответить с цитированием
  #13  
Старый 19.04.2013, 23:59
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Сделать массив из потоков, и присваивать в Potok[i]. Соответственно, останавливать тоже Potok[i]. А на будущее - отказаться от названий классов и переменных в транслитерации.
Код:
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
  Potok = class(TThread)
  private
    h: Extended;
  public
  protected
    procedure Execute; override;
    procedure ShowResult;
  end;
 
var
  Form1: TForm1;
  pot: array[1..10] of Potok;
   
implementation
 
{$R *.dfm}
 
{ Potok }
procedure Potok.Execute;
begin
  inherited;
  h:=0;
  while (h<>1000000000) do
  begin
    h:=h+0.001;
    Synchronize(ShowResult);
  end;
end;
 
procedure Potok.ShowResult;
begin
  Form1.Label3.Caption:=FloatToStr(h);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var i: Integer;
begin
  for i:=1 to 2 do
  begin
    pot[i]:=Potok.Create(false);
    pot[i].Priority:=tpNormal;
    pot[i].FreeOnTerminate:=true;
  end;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i: Integer;
begin
  for i:=1 to 2 do pot[i].Suspend;
end;
 
end.
Так?

Цитата:
Сообщение от Bargest
А на будущее - отказаться от названий классов и переменных в транслитерации.
Не очень понятно о чем это?
Ответить с цитированием
  #14  
Старый 20.04.2013, 00:29
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Так?
Да, только не понятно, зачем массив 1..10, когда используется всего два элемента.
Цитата:
Не очень понятно о чем это?
О назывании переменных и типов "транслитом". Примеры: Potok, Okno, Programma, Klavisha.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #15  
Старый 20.04.2013, 03:01
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Ну как дети, чес-слово. ТС поставь перед синхронайз паузу в 50-100 мс (миллисекунд) и будет тебе щастье (кста, наверное с большой буквы Щ)
ЗЫЖ видимо у тебя двухядерный проц
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 00:53.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter