![]() |
|
|
![]()
|
|
| Oberon83 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 6.5.2005 Где: Республика Чуваши я Репутация: 1 Всего: 1 |
У меня есть операция работы с БД, которая занимает значительное время. Для того, чтобы пользователь не сидел "сложа руки" во время работы программы с БД я поместил операции работы с БД в отдельный поток. Но при выполнении потока кнопки формы не активны (т.е. активны, но ка-то странно). Дело в том, что пока поток не завершит свое выполнение обработчики событий для кнопок не обрабатываются (да и сами кнопки "не нажимаются", т.е. событие нажатия на кнопку фиксируется, но визуально это не отображается). В чем может быть дело? Может быть я неправильно понимаю саму идею потоков? Или все дело в методе Sinchronize потока (поток работает с визуалом формы)?
Заранее благодарен за помощь. --------------------
OpenArea.ru |
|||
|
||||
| RatHat |
|
|||
![]() Вождь индейцев ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 5.9.2005 Репутация: -1 Всего: 1 |
А зачем такая возня с потоками?
Либо периодически обновляй форму, либо проставь в цикле следующий код: Application->ProcessMessage(); Тогда программа будет время от времени обрабатывать накопившиеся сообщения. --------------------
Ma a kis' hi ve'ist i wan'i na e'ho ho wan'i |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Наверное не правильно. Только не понятно в чем?
Все должно быть не связано и работать так, как Вы и планировали. Иначе теряется thread Кстати о птичках. Надеюсь в нитке при работе с БД используются отдельные DataSet ? И возможно, коннекшион тоже. Есть вариант, что ваша нитка и нитка приложения вызывают используют какой-нибудь метод( нитка использует через Sinchronize), тогда идет попеременная блокировка ниток. Добавлено @ 15:16
Ему же не обновление кнопок нужно, а обеспечить нормальную работу пользователя, пока дополнительная нитка обрабатывает БД -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| anwe |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 748 Регистрация: 2.9.2006 Репутация: нет Всего: 23 |
А созданый тобой поток "рабочий"? Может у тебя и в нем проводится общение с пользователем, в смысле обрабатываются сообщения? Надо, чтобы они обрабатывались в главном потоке, а рабочий лишь делал операции работы с БД.
|
|||
|
||||
| Oberon83 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 6.5.2005 Где: Республика Чуваши я Репутация: 1 Всего: 1 |
anwe, нет, работы с пользователем там нет.
Я вот тоже об этом думаю. В выходные проанализирую заново код - в понедельник доложу о результатах --------------------
OpenArea.ru |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
С нетерпением ждем отчета -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Oberon83 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 6.5.2005 Где: Республика Чуваши я Репутация: 1 Всего: 1 |
Просмотрев код, систематизировал объекты, связанные с формой:
1. Используется конект к БД с помощью ТIBDataBase; 2. Используются запросы TIBQuery; 3. Так же идет работа с OleContainer (в нем открыта книга Excel в которую заносятся данные из БД); Теперь вопрос: как это все поместить отдельно в поток? Т.е. и подключение к БД, выполнение запросов и обработка объекта в контейнере ole? Т.к. блокировка кнопок форм скорее всего происходит потому что поток использует OlecOntainer для считывания/записи данных (поскольку при простом запуске функции потока пез метода Synchronize, компилятор быдает ошибку контейнера ole). P.S.: При работе потока, подключение к БД и запросы ничем больше не используются. Это сообщение отредактировал(а) Oberon83 - 21.11.2006, 14:42 --------------------
OpenArea.ru |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 47 Всего: 59 |
Во-первых, я ничего не понял Вам нужно, определить что может одновременно используется отвновным потоком и дополнительным потоком Вы же пишите
Ну и что следует из этого? Вы же используете некоторые методы через Synchronize. По всей видимости, либо эти же методы либо используемые объекты в них одновременно пользует основной поток Я не понял, что значит достаточно просто иметь отдельную копию для дополнительного потока. Как Вы уж это сделаете = Ваша проблема. Либо чденами класса Вашего TThread, либо используя средства дизайна - TDataModule со всеми необходимыми для работы дополнительного потока компонентами. -------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Oberon83 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 6.5.2005 Где: Республика Чуваши я Репутация: 1 Всего: 1 |
У меня примерно то же самое. На основной форме есть панель, которая закрывает основную рабочую область. На этой панели расположен прогрессбар и кнопка отмены, так вот она ведет себя так как я описывал в первом посте. Работу с БД (коннект, запросы) вынес в отдельный datamodule, но это все-равно не помогло. Скорее всего кнопка ведет себя так потому что я постоянно из потока работаю со прогрессбаром, с помощью которого показывается процесс выполнения операции. Как можно "вынести" обработку прогрессбара из потока? --------------------
OpenArea.ru |
|||
|
||||
| Artemon |
|
|||
|
а ты мне нравишься ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1771 Регистрация: 24.2.2004 Где: Челябинск Репутация: 7 Всего: 20 |
А ты сначала попробуй отключить прогресс бар. Если все заработает на ура, вот тогда и выноси обработку прогресс бара из потока.
-------------------- Контроль топлива на топливозаправщиках, мониторинг автотранспорта, расчет зарплаты водителей www.rscat.ru |
|||
|
||||
| Oberon83 |
|
||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 158 Регистрация: 6.5.2005 Где: Республика Чуваши я Репутация: 1 Всего: 1 |
Похоже что без кода не обойтись.
Структура программы выглядит следующим образом: у меня существуют статистические формы, которые приходят к нам в электронном виде. Их нужно занести в БД и потом производить какие-либо действия (например формирование сводных отчетов и т.д.). В БД, грубо говоря, существуют 3 таблицы: CATEGORY, THEMES, WRITE. CATEGORY - таблица, которая представляет из себя столбцы таблицы (наименование поля, номер ячейки Excel и т.д.), THEMES - строки (наименование поля, номер ячейки Excel), а WRITE - таблица для сохранения результатов (ном. столбца, ном. строки, значение). Excel формы загружаются в OLE контейнер, расположенный на форме. После этого мне нужно сохранить результат в базу, причем так, чтобы приложение "не висело" и пользователь мог остановить процесс загрузки данных как в OLE контейнер, так и в базу данных (как раз этого не получается).
Функция запуска потока:
Загрузка формы в программу:
Загрузка шаблона формы в OLE контейнер и начальная инициализация:
P.S.: Прошу не ругать за "удобочитаемость" кода. --------------------
OpenArea.ru |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++ Builder" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C++ Builder | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |