Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2012, 18:38   #1
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию Опять про многопоточность!

Всем привет!

С потоками раньше работал, но только с одним. И создавал его, как известно, через "File" > "New" > "Other" > "Thread Object". Здесь все просто.

Но теперь появилась необходимость создать 5, 10, ну или сколько захочется потоков. Здесь для меня тупик.

Информации в гугле вроде бы много, но она как-то не структурирована и нет четкого понимания как, все таки, создается этот "массив потоков". Вычитал, что как-то в цикле вроде бы, но не понимаю как...

Может быть кто-нибудь уделит время и поможет?

Для примера: на форме есть 5 Label-ов. Нужно создать 5 потоков и пусть каждый поток считает от 1 до 100 000 и выводит это в соответствующий по порядковому номеру Label.
trafbite вне форума Ответить с цитированием
Старый 19.02.2012, 19:05   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Код:
unit Unit2;

interface

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

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

// Наш поток
 tt = class(TThread)
  // В него будет передаваться параметр, с которым поток что-то будет делать
  private     l:TLabel;
    { Private declarations }
  protected
  // Процедура срабатывания потока
    procedure Execute; override;
  end;
       // Список потоков будет храниться в специального класса объекте - TThreadList
var    lt:TThreadList;
  Form2: TForm2;

implementation

{$R *.dfm}

{ tt }

procedure tt.Execute;
begin
  inherited;
  // Задерживаем поток на...
   sleep(Random(5000));
  // После че-то делаем с объектом, который в него передан
   l.Caption:=TimeToStr(time);
end;

procedure TForm2.Button1Click(Sender: TObject);
var i:integer;t:tt;
begin
// Допустим мы хотим назначить поток каждой Лейбе на форме
// В цикле пройдемся по форме
 for i :=0 to ControlCount-1 do begin
 // В поисках Лейбы
   if Controls[i] is TLabel then begin
   // И если нашло - создадим приостановленный поток
    t:=tt.Create(true);
    // Передадим ему Лейбу
    t.l:=TLabel(Controls[i]);
    // И запустим
    t.Start;
    // Не забыв вписать его в наш вписок потоков
    lt.Add(t);
   end;
 end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
 // Который создаем при создании формы
 lt:=TThreadList.Create;
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
// И валим при ее разрушении, корректно останавливая и разрушая все
// входящие в него потоки
 lt.Free;
end;

end.
Ферштейн?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.02.2012, 19:58   #3
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Спасибо за столь оперативный ответ!Но не совсем ферштейн :

1. При нажатии на кнопку выдает ошибку:

Access_Violation.jpg

2. Через поток находит первый Лейбл и передает ему значение времени и все, больше ничего Насколько я понял, поток должен по всем лейблам пройтись и передать каждому значение времени в тот момент, когда поток до него дошел.

3. Если я правильно понял в п. 2, то это не совсем то, что нужно. Нужно понять как создать 5 потоков, которые работали бы параллельно. Т.е., из примерного задания первого поста, пусть они работают параллельно (считают от 1 до 100 000) и выводят текущее значение в соответствующий лейбл (так будет видно, что они действительно работают).


Во как!
trafbite вне форума Ответить с цитированием
Старый 19.02.2012, 22:24   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
поток должен по всем лейблам пройтись и передать каждому значение времени в тот момент, когда поток до него дошел.
Неа. Для каждого лейбла создается свой поток. Посмотри внимательно - там цикл.
Цитата:
как создать 5 потоков, которые работали бы параллельно.
А у меня их не 5 а столько сколько лейб на форме, подумаешь разница...
Еще раз найвнимательнейшим образом пробуй мой пример. НАЙВНИМАТЕЛЬНЕЙШИМ
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.02.2012, 22:41   #5
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

А что по поводу ошибки? Что это за беда?

Ну да, после своего последнего поста еще покурил твой код - согласен, для каждого лейбла свой поток, НО! (код изучил наивнимательнее некуда )

1. Новый поток создается только после завершения выполнения предыдущего, верно? (ведь до его завершения просто не произойдет переход на след. шаг цикла, вроде как. Или в цикле происходит только пуск потока, а за его завершением уже не следит никто?).

2. Выполнение цикла происходит только один раз, как я ранее писал. Т.е. да, первый поток создался, отработал и все, второй уже не создается...
trafbite вне форума Ответить с цитированием
Старый 19.02.2012, 22:51   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ошибка почти наверняка из-за того, что к лэйбам из потоков обращаетесь без синхронизации. То что лейб как параметр передается и в ее Caption только из одного потока пишется ни чего не меняет. В цикле не ожидается завершение потока
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 19.02.2012 в 22:54.
Аватар вне форума Ответить с цитированием
Старый 19.02.2012, 23:10   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Новый поток создается только после завершения выполнения предыдущего, верно?
Нет. Они все создаются в цикле так сказать "параллельно".
Цитата:
в цикле происходит только пуск потока, а за его завершением уже не следит никто
Я тебя за язык не тянул - сам ответил на свой же вопрос )
Цитата:
первый поток создался, отработал и все, второй уже не создается...
Нет. Создаются все потоки.
Цитата:
Ошибка почти наверняка из-за того, что к лэйбам из потоков обращаетесь без синхронизации.
Ну подумаешь... Не предусмотрел такую мелочь. Откуда я знал что автору вздумается завершать прогу пока потоки не отработают, или еще чего...
Это же только пример, призванный натолкнуть на мысль.
Цитата:
trafbite
Ты по-моему не совсем верно понимаешь что из себя представляют потоки... Может стоит почитать спецлитературу по Делфи?
I'm learning to live...

Последний раз редактировалось Stilet; 19.02.2012 в 23:12.
Stilet вне форума Ответить с цитированием
Старый 20.02.2012, 00:11   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Ну подумаешь... Не предусмотрел такую мелочь
Stilet, я и не имел ввиду ваш код, код потока - проблемы ТС, ему и намекал на возможную ошибку
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.02.2012, 08:26   #9
trafbite
Форумчанин
 
Регистрация: 21.07.2007
Сообщений: 103
По умолчанию

Цитата:
Нет. Создаются все потоки.
Ну тогда странно почему на форму выводится время только в первый лейбл, в остальные ничего не выводится.
Цитата:
Ошибка почти наверняка из-за того, что к лэйбам из потоков обращаетесь без синхронизации.
Хм, точно, нужно попробовать через синхронизацию
Цитата:
Ты по-моему не совсем верно понимаешь что из себя представляют потоки... Может стоит почитать спецлитературу по Делфи?
Посоветуй, пожалуйста, что-нить конкретное!
trafbite вне форума Ответить с цитированием
Старый 20.02.2012, 08:35   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
странно почему на форму выводится время только в первый лейбл, в остальные ничего не выводится.
Может ты просто не дождался? Я же там прикололся и задержку потока поставил рандомно... Она могла и 5 мин длиться
Поставь везде sleep(1000) должна через секунду сработать каждая. Ну или почти через секунду.
Цитата:
Посоветуй, пожалуйста, что-нить конкретное!
Кроме Тексейры и Пачеко ниче не посоветую...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Опять про антиспам=( gunsoy PHP 5 05.01.2012 14:49
Опять про печать. СтаниславАВ Microsoft Office Excel 3 07.04.2011 07:41
Опять про каптчу kardinal94 Работа с сетью в Delphi 11 20.09.2010 20:20
Опять про кризис vasek123 Свободное общение 32 13.03.2009 16:56
Опять про гистограммму artemavd Общие вопросы Delphi 10 15.07.2008 11:44