![]() |
|
|
![]()
|
|
| 0x00 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 3.4.2006 Репутация: нет Всего: нет |
Возникла проблема.
На форме лежит cxGrid1, oraQuery1, oraDataSource. Форма представляет из себя форму поиска. Поиск сложный, по нескольким таблицам с от 100 до 20 000 000 записей в каждой. Все работает медленно и пока выполняется запрос вся программа зависает. Решил засунуть выполнение запроса в поток.
поток создаю так:
в потоке все отрабатывает прекрасно, но есть одно НО! При прорисовке грида вылетает неуловимая ошибка Access violation (в конце концов грид прорисовывается, но справа нет скроллбара). Методом тыков обнаружил что если перед выполнением потока сделать this->cxGrid1->Visible = false; и после его выполнения соответственно this->cxGrid1->Visible = true;, то все отрабатывает без Access violationОВ. Ктонибудь сталкивался с подобной проблемой? |
||||
|
|||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 18 Всего: 135 |
Если ты из потока вызываешь VCL-компоненты, то понятно, что у тебя всё падает. Этого делать нельзя.
Чтобы из отдельного потока добираться к визуальным компонентам нужно 1. Наследоваться от TThread 2. Написать функцию Execute 3. Сделать в ней невизуальные действия 4. Вызвать Synchronize( drawOnGrid ) 5. А уже в функции drawOnGrid дёргать VCL-компоненты кури TThread и Synchronize -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| 0x00 |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 3.4.2006 Репутация: нет Всего: нет |
я конечноже пробывал и стандартный билдеровский tthread. от Synchronize( drawOnGrid ) нету толка, он блокирует доступ к обьектам над которыми производятся операции и программа всеравно зависает при поиске |
|||
|
||||
| 586 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 57 Всего: 146 |
Не допускай, чтобы синхронизация выполнялась долго, иначе прога будет зависать. Если так напишешь:
то действительно, программа зависнет. А если напишешь так:
Проблем быть не должно. Это сообщение отредактировал(а) 586 - 28.7.2010, 07:24 |
||||
|
|||||
| 0x00 |
|
||||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 192 Регистрация: 3.4.2006 Репутация: нет Всего: нет |
Ура! Нашел решение.
программа вываливается при прорисовке грида. перед запуском потока
и самое интересное в потоке sql запрос не в synchronize. в synchronize только прорисовка грида)
|
||||
|
|||||
| mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 167 Всего: 306 |
||||
|
||||
![]()
|
| Правила форума "С++ 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. |