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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.10.2011, 19:45   #1
iKarma
Кипучий чайник
Пользователь
 
Регистрация: 17.10.2011
Сообщений: 55
По умолчанию Создание нескольких потоков

Суть проблемы таковая - мне нужно создать несколько потоков (их количество задаётся в командной строке) и вывести созданным потоком его текущий порядковый номер.
Код:
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Classes;
 
type
  TMyThread = class(TThread)
    private
    protected
    procedure Execute; override;
end;
 
var
  MyThread: TMyThread;
  ThreadNumber, i: integer;
 
procedure TMyThread.Execute; //опишем код, который будет выполняться в потоке
begin
  Writeln('I am thread number ', i);
end;
 
begin
  write('Enter number of threads = ');
  read(ThreadNumber);
  for i := 1 to ThreadNumber do
  begin
    MyThread := TMyThread.Create(False); //создаём экземпляр потока //False означает, что поток запускается сам сразу после создания
    MyThread.Priority := tpNormal; //укажем параметры потока, например, приоритет
    MyThread.FreeOnTerminate := True;  //после завершения кода поток завершится автоматически
  end;
  Readln;
  Readln;
end.
Вроде потоки создаются, но вот с выводом порядкового номера где-то я ошибся. Помогите пожалуйста)
iKarma вне форума Ответить с цитированием
Старый 17.10.2011, 19:59   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Проблема у вас далекоо не с порядковым номером...
Поток это отдельная программа, и она не ждёт чего-либо от той программы которая её создала.
Сразу выполняет execute. Не следует об этом забывать.

Куда проще потоку передать его номер.
Вот как надо:

Код:
program Project1;
 
{$APPTYPE CONSOLE}
 
uses
  SysUtils, Classes;
 
type
  TMyThread = class(TThread)
    private
    fID:Integer; //переменная-свойства
    procedure SetID(Value:Integer); //присвоение переменной-свойства значения
    function GetID:Integer; //возврат значения из переменной-свойства
    protected
    procedure Execute; override;
    public
    //Само свойство(Почему в public, думаю, обьяснять не надо(Но подробнее у справки делфи))
    property ThreadID:Integer read GetID write SetID;
end;
 
var
  MyThread: TMyThread;
  ThreadNumber, i: integer;
 
procedure TMyThread.Execute;
begin
  Writeln('I am thread number ', ThreadID);
end;

{
Процедура присвоения значения в переменную свойства
}
procedure TMyThread.SetID(Value:Integer);
begin
  fID:=Value;
end;

{
функция возврата значения свойства из переменной свойства
}

Function TMyThread.GetID:string;
begin
  Result:=fID;
end;

begin
  write('Enter number of threads = ');
  read(ThreadNumber);
  for i := 1 to ThreadNumber do
  begin
    MyThread := TMyThread.Create(True);
    MyThread.Priority := tpNormal; 
    MyThread.FreeOnTerminate := True;  
    MyThread.ThreadID:=i;
    myThread.Resume;
  end;
  Readln;
end.
красным отметил, то что я изменил/добавил.

Последний раз редактировалось Человек_Борща; 17.10.2011 в 20:02.
Человек_Борща вне форума Ответить с цитированием
Старый 17.10.2011, 20:42   #3
iKarma
Кипучий чайник
Пользователь
 
Регистрация: 17.10.2011
Сообщений: 55
По умолчанию

Код:
Function TMyThread.GetID:string;
я так понимаю должно быть:
Код:
function GetID:Integer;
Код:
MyThread := TMyThread.Create(True);
это значит, что поток не запускается сразу после создания?

и возникает такая ситуация иногда в виде некорректного отображения числа потоков, то есть например 2 раза выводится на экран один и тот же поток, это с чем-то связано? хотя если ещё раз запустить программу, то всё показывается как надо.
iKarma вне форума Ответить с цитированием
Старый 17.10.2011, 20:53   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

1. да
2. Правильно, паоток создаётся но не пускаеся в работу.
3. Это от вас зависит. Мои надбавки на это не влияют=)
Человек_Борща вне форума Ответить с цитированием
Старый 19.10.2011, 09:53   #5
iKarma
Кипучий чайник
Пользователь
 
Регистрация: 17.10.2011
Сообщений: 55
По умолчанию

Код:
MyThread := TMyThread.Create(True);
а почему именно надо, чтобы поток не сразу запускался после создания и как он тогда запускается, после чего то есть?
iKarma вне форума Ответить с цитированием
Старый 19.10.2011, 11:12   #6
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Код:
    //Создаём поток "на паузе".
    MyThread := TMyThread.Create(True);
    //устанавливаем ему приоритет
    MyThread.Priority := tpNormal; 
//Разрешаем убить себя по завершению работы.
    MyThread.FreeOnTerminate := True;  
//передаём параметр
    MyThread.ThreadID:=i;
//Даём команду "продолжить работу"
    myThread.Resume;
Я держусь того, что нужно создать обькт, задать ему параметры(нужные мне) и только затем стартовать.
Иначе поток может отработать до того, как основной VCL закончить задавать параметры эту потоку.
Человек_Борща вне форума Ответить с цитированием
Старый 19.10.2011, 13:05   #7
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Я конечно, как обычно, со своим уставом в ваш монастырь...

Массив потоков реализовать не? Поток с точки зрения компилятора - что? Да, объект.
Следовательно, можно эти самые объекты и запихоть хотя бы в тот же TObjectList
И работать с ними как с элементами массива.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 19.10.2011, 13:11   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Очень не плохой вариант. Я так реализовал работу в своём ПО.
Но вопрос о запуске нескольких потоков подряд а не об организации средства управления множеством.
Человек_Борща вне форума Ответить с цитированием
Старый 19.10.2011, 13:47   #9
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Ну раз человеку нужно вывести его текущий порядковый номер - то это не с проста
Для чего нужен текущий номер? Наверное для того, чтоб обращаться к нему...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 20.10.2011, 18:11   #10
iKarma
Кипучий чайник
Пользователь
 
Регистрация: 17.10.2011
Сообщений: 55
По умолчанию

Johnson и Человек_Борща, спасибо за идею про массив потоков =)
iKarma вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание потоков kardinal94 Общие вопросы Delphi 4 15.08.2011 12:04
Создание потоков cargo29 Общие вопросы Delphi 16 07.08.2011 12:11
Запуск нескольких потоков bulldog5293 Общие вопросы Delphi 3 11.11.2010 18:24
Как реализовать запуск и контроль нескольких однотипных потоков. Son Общие вопросы Delphi 5 29.04.2010 08:40
Работа с файлом из нескольких потоков boris-blade Общие вопросы .NET 2 02.04.2010 17:21