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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.01.2014, 08:21   #1
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию Многопоточность

Код:
type
 TPotok=class(TThread)
  private
   html:WideString;
      procedure reg;
  protected
   procedure Execute;override;
end;

procedure TPotok.reg;
begin
 Form1.sMemo2.Lines.Add(rege.Match[0]);
end;

procedure TPotok.Execute;
begin
  for i:=0 to Form1.sMemo1.Lines.Count-1 do
  begin
    try
      site:=Form1.sMemo1.Lines.Strings[i];
      html:=HTTP.Get(site);
    except
    end;
    if rege.Exec(html) then
     repeat Synchronize(reg);
     until (not rege.ExecNext) or Potok.Terminated;
    if Potok.Terminated then break;
  end;
  HTTP.Free;
  Rege.Free;
end;
Имеется следующий поток, как задать ему кол-во потоков в SpinEdit?
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 12.01.2014, 08:52   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

В цикле for создать количество экземпляров потока равное значению в spinedit.
ИМХО: Лучше это делать с помощью динамических массивов.
Код:
var
  potoks: array of TPotok;//Динамический массив потоков
begin
...
  SetLength(potoks,SpinEdit1.Value); //Задаём размер массива потоков 
for i:=0 to SpinEdit1.Value-1 do //Создаём нужное количество потоков
  potoks[i]:=TPotok.Create(false);
Примерно как-то так.
Streletz вне форума Ответить с цитированием
Старый 12.01.2014, 08:59   #3
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от Streletz Посмотреть сообщение
В цикле for создать количество экземпляров потока равное значению в spinedit.
ИМХО: Лучше это делать с помощью динамических массивов.
Код:
var
  potoks: array of TPotok;//Динамический массив потоков
begin
...
  SetLength(potoks,SpinEdit1.Value); //Задаём размер массива потоков 
for i:=0 to SpinEdit1.Value-1 do //Создаём нужное количество потоков
  potoks[i]:=TPotok.Create(false);
Примерно как-то так.
Не работает.
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 12.01.2014, 09:40   #4
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
Вопрос

Цитата:
Сообщение от Fahman Посмотреть сообщение
Не работает.
Почему не работает? Работает. Просто у Вас видимо, где-то ошибка.
Можете выложить Ваш код формирования потоков, который выдаёт ошибку?
В чём суть проблемы?
Кстати, SpinEdit лучше не использовать, он не всегда работает корректно. Лучше используйте UpDown в ассоциации с Edit.

Последний раз редактировалось Streletz; 12.01.2014 в 10:06.
Streletz вне форума Ответить с цитированием
Старый 12.01.2014, 17:08   #5
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

/facepalm

Во-первых, есть такой класс как TThreadList, скорее всего идеально использовать его. Но, я привык всегда использовать TStringList для этих целей - и универсальное хранилище для объектов и одновременно хранилище строк.

Код:
var
 FDB: TStringList;
 obj: TPotok;
 i: Integer;
begin
 FDB:= TStringList.Create;

 for i:=0 to SpinEdit.Value-1 do
  begin
   obj:=TPotok.Create;
   FDB.AddObject('', obj);
   obj.Start;
  end;
end;
STRELOK-2007 вне форума Ответить с цитированием
Старый 13.01.2014, 13:01   #6
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от STRELOK-2007 Посмотреть сообщение
/facepalm

Во-первых, есть такой класс как TThreadList, скорее всего идеально использовать его. Но, я привык всегда использовать TStringList для этих целей - и универсальное хранилище для объектов и одновременно хранилище строк.

Код:
var
 FDB: TStringList;
 obj: TPotok;
 i: Integer;
begin
 FDB:= TStringList.Create;

 for i:=0 to SpinEdit.Value-1 do
  begin
   obj:=TPotok.Create;
   FDB.AddObject('', obj);
   obj.Start;
  end;
end;
При старте ошибка - "Cannot call Start on a running or suspended thread."
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 13.01.2014, 13:14   #7
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от Fahman Посмотреть сообщение
При старте ошибка - "Cannot call Start on a running or suspended thread."
ну так прочтите ошибку и примите меры.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.01.2014, 13:21   #8
Fahman
Форумчанин
 
Аватар для Fahman
 
Регистрация: 03.04.2013
Сообщений: 703
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
ну так прочтите ошибку и примите меры.
Сам я не силен в англ. а гугл старнно переводит

"Невозможно вызвать Пуск на бег или приостановленного потока."
99% ошибок компьютера сидит в полуметре от монитора.
Fahman вне форума Ответить с цитированием
Старый 13.01.2014, 14:19   #9
demiware
Пользователь
 
Аватар для demiware
 
Регистрация: 13.01.2014
Сообщений: 21
По умолчанию

Все написано в хэлпе по методу start :
Цитата:
Starts the execution of a thread.
Call Start to cause a thread that was created in suspended state to start its execution. To create a thread in suspended state, pass true to the thread's constructor. For threads that were not created in suspended state, calling Start has no effect.
Если в англ. не силен, поясню: поскольку в конструкторе потока нет параметра TRUE, то Start не надо вызывать - поток уже стартанул после создания сразу...
-----------
Мой блог http://demiware.ru
Приглашаю в мой блог http://demiware.ru о программировании в Delphi, PHP(Symfony)...

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

А я дополню:
Если obj:=TPotok.Create; то obj.Start не нужен. Но если нужно просто создать поток, чтоб перед его работой какие-то его поля проинициализировать то:
Код:
  begin
   obj:=TPotok.Create(false);
   FDB.AddObject('', obj);
   obj.Start;
  end;
тогда поток создается приостановленным и ждет старта.
Кстати в твоем коде можно просто: FDB.AddObject('', TPotok.Create()); и все.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность lalilulelo Операционные системы общие вопросы 20 16.04.2012 19:33
многопоточность Freddi Krjuger Общие вопросы по Java, Java SE, Kotlin 1 15.05.2011 23:46
Многопоточность Dezmont_ Общие вопросы .NET 1 06.11.2010 18:34
многопоточность @lenk@ Помощь студентам 1 26.10.2010 20:50
многопоточность DeDoK Общие вопросы Delphi 6 01.08.2010 02:14