![]() |
Модераторы: Snowy, MetalFan, bems, Poseidon |
![]() ![]() ![]() |
|
tarakan |
|
|||
Новичок Профиль Группа: Участник Сообщений: 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’ы. Подскажите как это осуществить? |
|||
|
||||
kami |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 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-им все комбобоксы. Ну, это так - навскидку ![]() Это сообщение отредактировал(а) kami - 24.8.2016, 18:51 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |