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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.02.2014, 16:31   #1
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию Сбор инфы в несколько потоков

Привет!

Как получить данные с сайта с помощью нескольких динамических потоков?
Не копировать же один и тот же код в несколько созданных руками потоков, должен быть более разумный вариант.

Посерфил гугл, не нашел пока, то что нужно. Возможно Вы подскажите или поможете примером, буду благодарен.
bilibian вне форума Ответить с цитированием
Старый 16.02.2014, 16:38   #2
Streletz
Старожил
 
Регистрация: 03.01.2014
Сообщений: 2,870
По умолчанию

Цитата:
Сообщение от bilibian Посмотреть сообщение
Не копировать же один и тот же код в несколько созданных руками потоков, должен быть более разумный вариант.
Создавайте несколько экземпляров одного и того же потока или используйте ThreadPool.
В помощь:
Работа с потоками (C# и Visual Basic)
Streletz вне форума Ответить с цитированием
Старый 16.02.2014, 16:39   #3
cotseec
Пользователь
 
Регистрация: 02.05.2012
Сообщений: 45
По умолчанию

Цитата:
Сообщение от bilibian Посмотреть сообщение
Не копировать же один и тот же код в несколько созданных руками потоков, должен быть более разумный вариант.
а зачем копировать? поток описан как класс, создайте столько объектов класса, сколько необходимо, не забудьте про синхронизацию
Skype: cotseec
ICQ: 330-171-495
cotseec вне форума Ответить с цитированием
Старый 16.02.2014, 16:45   #4
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от cotseec Посмотреть сообщение
а зачем копировать? поток описан как класс, создайте столько объектов класса, сколько необходимо, не забудьте про синхронизацию
А как быть с idHTTP?? Для каждого потока свой. Например поток 1 = idHTTP1, поток 2 = idHTTP2. Не могу же я получать данные с 5 потоков через один экземпляр idHTTP.
bilibian вне форума Ответить с цитированием
Старый 16.02.2014, 16:49   #5
cotseec
Пользователь
 
Регистрация: 02.05.2012
Сообщений: 45
По умолчанию

либо создавать в потоке idHTTP динамически (соответственно для каждого потока свой объект idHTTP) либо получить информацию в главном потоке, а потом раздать дочерним потокам для ее обработки - это все зависит от логики и/или предназначения программы
Skype: cotseec
ICQ: 330-171-495
cotseec вне форума Ответить с цитированием
Старый 17.02.2014, 06:51   #6
bilibian
Форумчанин
 
Регистрация: 21.01.2014
Сообщений: 389
По умолчанию

Цитата:
Сообщение от cotseec Посмотреть сообщение
не забудьте про синхронизацию
С синхронизацией ситуация сложная, так как когда я обращаюсь к визуальным объектам на форме я использую параметры, например в мемо вывожу номер текущей позиции в цикле.
Код:
Synchronize(Update(i));
Естественно будет ошибка так как Synchronize не поддерживает передачу параметров к процедуре.

А если передавать эти параметры глобальным переменным, то когда будут работать несколько потоков они будут перезаписывать друг друга, что в итоге приведет к хаусу.

Как быть, не знаю.

Цитата:
Сообщение от cotseec Посмотреть сообщение
поток описан как класс, создайте столько объектов класса, сколько необходимо
Например так?

Код:
T1:=Thread.Create(true);
T1.FreeOnTerminate:=true;
T1.Resume;
T1.Priority:=tpNormal;

T2:=Thread.Create(true);
T2.FreeOnTerminate:=true;
T2.Resume;
T2.Priority:=tpNormal;

T3:=Thread.Create(true);
T3.FreeOnTerminate:=true;
T3.Resume;
T3.Priority:=tpNormal;
bilibian вне форума Ответить с цитированием
Старый 18.02.2014, 12:09   #7
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

Цитата:
Synchronize(Update(i));
когда мне нужно было передать параметр через синхронизацию я делал так:

необходимые параметры описывал как поля в классе,
+ пишутся 2 процедуры:

Код:
TDL = class
...
FMessage:string; // текстовое сообщение
FPos:integer; // позиция в цикле
...
procedure SyncSendProgress;
procedure SendProgress(Message:string; Pos:integer);
...
end;

implementation

// процедура, отправляющая данные через событие
procedure TDL.SyncSendProgress;
begin
FOnProgress(FMessage,FPos); запустить событие и передать данные
end;

procedure TDL.SendProgress(Message:string; Pos:integer);
begin

// сохраняем параметры в поля класса
FMessage:=Message; 
FPos:=Pos; 
 
// запускаем в синхронизацию процедуру, которая не требует параметров    
Synchronyze(SyncSendProgress);

end;
после описания такой конструкции можно прямо в потоке просто писать:

SendProgress('загрузка страницы',d);

минусы: загромождение кода вспомогательными полями и процедурами
плюсы: простота использования

на мой взгляд плюсов несоизмеримо больше =)
xrob вне форума Ответить с цитированием
Старый 18.02.2014, 16:35   #8
STRELOK-2007
Форумчанин
 
Регистрация: 06.08.2009
Сообщений: 144
По умолчанию

Synchronize(procedure begin Update(1); end);

религия не позволяет написать?

Даже так можно!
Synchronize(procedure begin ShowMessage('blabla'); end);
STRELOK-2007 вне форума Ответить с цитированием
Ответ


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

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Логгирование, несколько потоков pa6kevi4 Общие вопросы .NET 3 12.06.2010 22:32
[Вопрос] IdHttp в несколько потоков TilerDerton Работа с сетью в Delphi 3 22.09.2009 22:14
Ссылка на файл из текущей папки! Сбор инфы в один файл! mephist Microsoft Office Excel 11 10.07.2009 13:51
Несколько потоков Adm Общие вопросы Delphi 13 18.01.2008 20:04
Сбор инфы с сайта. Mss_Smith Помощь студентам 6 17.06.2007 16:26