Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация потоков 
:(
    Опции темы
tarakan
Дата 24.8.2016, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 11.11.2008

Репутация: нет
Всего: нет



Подскажите, пожалуйста, на моем примере как правильно синхронизировать несколько потоков.
На форме есть n количество combobox, каждый заполняется из разных таблиц БД.
Я делал так
1.    Выключаю первый combobox.  ( synchronize(comboboxN.enable = false)   )
2.    В Execute создаю TstringList и заполняю его данными из таблицы N, т.е. while not tableN.eof do TstringListN.add(tableN.poleN)
3.    Потом synchronize (comboboxN.items := TstringListN)
4.    И включаю ComboboxN (  synchronize(comboboxN.enable = false) )
Так я проделываю со всеми Combobox по очереди, а хочется запустить несколько потоков, заполнить все Combobox и по окончании включить сразу все. Т.е. я понимаю так, что должен быть поток, который бы запускал все остальные и проверял : все законченно или нет. Если все потоки отработали, то включил все combobox’ы. Подскажите как это осуществить?

PM MAIL   Вверх
kami
Дата 24.8.2016, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 22
Всего: 72



Зачем еще один доп. поток?
Вариант 1, избыточный:
- в главном потоке дисаблим все комбобоксы, 
- специально заведенной переменной-счетчику, которая будет хранить количество запущенных потоков, сразу присваиваем значение n.
- стартуем n дополнительных потоков, выставляем им FreeOnTerminate:=True и назначаем событие OnTerminate, в них (в потоках) выполняются п.2-4. 
- в событии OnTerminate (вызовется в главном потоке) переменная-счетчик уменьшаем на 1. Если достигнут 0 - enable-им все комбобоксы.

Вариант 2, более оптимальный, если используется ADO (в этом случае доп. потоки ложатся на плечи операционной системы):
- Для чтения данных используем TADOConnection и любого наследника TADODataSet( TADOQuery, например).
- для этого Query выставляем флаг AsyncExecute и назначаем событие OnAfterOpen
- Дисаблим все комбобоксы, делаем Open сразу всем этим TADOQuery. Ввиду асинхронности выполнения дальнейший код будет выполняться без задержек.
- не забываем про переменную-счетчик из варианта 1, ей также выставляем значение n.
- при срабатывании OnAfterOpen заполняем комбобоксы данными (не забываем - это событие сработает в дополнительном потоке, т.е. нужно Synchronize) и уменьшаем счетчик на 1.
- по достижению 0 - enable-им все комбобоксы.

Ну, это так - навскидку smile

Это сообщение отредактировал(а) kami - 24.8.2016, 18:51
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0668 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.