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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2016, 12:54   #1
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию Передать компонент в поток

Доброго времени суток!
у меня есть потоки, которые выполняют один и тот же код, но заполняют разные компоненты, можно ли свести все это до 1 потока в который просто будут передавать компоненты которые нужно заполнить например memo1, memo2 ?
nibufep вне форума Ответить с цитированием
Старый 27.06.2016, 13:24   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
у меня есть потоки, которые выполняют один и тот же код, но заполняют разные компоненты, можно ли свести все это до 1 потока в который просто будут передавать компоненты которые нужно заполнить например memo1, memo2 ?
конечно можно, но вопрос нужно ли???
VCL компоненты (в т.ч. Memo) НЕ предусматривают работу В Потоках БЕЗ синхронизации!!! (читай про Synchonize).
А работа потока внутри Synchronize это тоже что и работа БЕЗ потоков.

Вар 1. классический
1. объявляем поле данных потока, для хранения ссылки на компонент.
2.ПИШЕМ свой конструктор потока, в котором ПОЛУЧАЕМ необходимый ему компонент и заполняем поле (см. п.1)
Код:
constructor Create(mymemo: TMemo);
2. ПИШЕМ процедуру-метод потока БЕЗ ПАРАМЕТОВ по передаче данных из области данных потока непосредственно в компонент.
Код:
procedure SetData;
3. В методе Execute получаем данных (заполняем ПОЛЯ данных потока) и ПОСЛЕ этого в режиме синхронихации с основным потоком(общим потоком работ с компонентами) вызываем наш метод передачи данных.
Код:
Synchronize(SetData); //а это остановка(!) потока до окончания работы процедуры SetData
Вопрос ЧТО-то останется в Execute(ВНЕ Syncronize) при таком условии??? Нужно ли из-за этого оставлять поток или будет проще сделать все "напрямую"


Вар 2. Разбираемся КАК передавать сообщения различным окнам. PostMessage и ЕЕ параметры. И какие именно сообщения нужны для передачи данных в Memo.

1. В конструкторе потока указываем с каким окном будем работать. (1-ый параметр PostMessage)
2. В Execute вызываем отправку сообщения c нужными(!!!) параметрами.
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 27.06.2016 в 13:27.
evg_m вне форума Ответить с цитированием
Старый 27.06.2016, 13:31   #3
nibufep
Форумчанин
 
Регистрация: 02.08.2014
Сообщений: 476
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
конечно можно, но вопрос нужно ли???
у меня есть допустим 6 потоков, все они заходят на один и тот же сайт, только по разным страницам (т.е. по мимо компонентов еще нужно передать в поток эту самую ссылку), парсят от туда одни и те же данные, но выводит в разные memo, удобнее и проще я думаю передавать компонент в поток, чем держать кучу одинаковых потоков...?
Цитата:
Сообщение от evg_m Посмотреть сообщение
VCL компоненты (в т.ч. Memo) НЕ предусматривают работу В Потоках БЕЗ синхронизации!!! (читай про Synchonize).
А работа потока внутри Synchronize это тоже что и работа БЕЗ потоков.
ну это понятно, но в синхронизации у меня только вывод в memo, а в самом Execute уже get на сайт и парсинг
nibufep вне форума Ответить с цитированием
Старый 27.06.2016, 13:41   #4
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

Цитата:
удобнее и проще я думаю передавать компонент в поток, чем держать кучу одинаковых потоков...?
типы (классы) для потоков делают в зависимости от их функционального назначения, а не от каких-то никому не нужных контролов. Код потока должен делать только то что ему надо, а распихивать по контрола должен гуи поток. Ваша задача правильно организовать это.
come-on вне форума Ответить с цитированием
Старый 27.06.2016, 13:59   #5
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
парсят от туда одни и те же данные, но выводит в разные memo, удобнее и проще я думаю передавать компонент в поток,
удобнее указывать потокам ЧТО (какую процедуру) надо выполнить ПРИ наступлении некоего события.
Цитата:
И можем при этом попросить поток "проинфомировать" нас о завершении получения данных.
http://programmersforum.ru/showpost....7&postcount=15
Цитата:
ПРИНЦИП разделяй и властвуй: при изменении способа вывода (memo|....) способ получения (ПОТОКИ) остаются НЕИЗМЕННЫМИ.
http://programmersforum.ru/showpost....65&postcount=7
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 27.06.2016, 16:41   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Можно и контрол передавать. А внутри потока передавать в него (контрол) готовое содержимое внутри DoTerminate(), к примеру так:
Код:
type
  TMyFuckingThread = class(TThread)
  private
    LEdit: TCustomEdit;
  protected 
     procedure DoTerminate; override;
  public
    constructor Create(const CreateSuspended: Boolean; AEdit: TCustomEdit); reintroduce;
  end;

implementation

constructor TMyFuckingThread.Create(const CreateSuspended: Boolean; AEdit: TCustomEdit); 
begin
  LEdit:= AEdit;
  inherited Create(CreateSuspended);
end;

procedure TMyFuckingThread.DoTerminate; 
begin
  if Assigned(LEdit)
    then LEdit.Text:= <твоя шняга - результат>;
  inherited;
end;
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как передать данные в поток.. login10 C# (си шарп) 9 01.11.2014 15:08
Как передать динамический массив в поток? bilibian Общие вопросы Delphi 8 28.02.2014 15:22
Как передать структуру в поток при _beginthread Ksardas13 Общие вопросы C/C++ 2 10.03.2012 05:00
Как передать параметр в поток? Pack Общие вопросы Delphi 3 22.02.2012 12:09
Передать переменную в поток,туплю. larin1974 Помощь студентам 2 20.11.2009 05:25