| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C++ Builder > Dev express Grid и поток |
| Автор: 0x00 27.7.2010, 15:46 | ||||
| Возникла проблема. На форме лежит cxGrid1, oraQuery1, oraDataSource. Форма представляет из себя форму поиска. Поиск сложный, по нескольким таблицам с от 100 до 20 000 000 записей в каждой. Все работает медленно и пока выполняется запрос вся программа зависает. Решил засунуть выполнение запроса в поток.
поток создаю так:
в потоке все отрабатывает прекрасно, но есть одно НО! При прорисовке грида вылетает неуловимая ошибка Access violation (в конце концов грид прорисовывается, но справа нет скроллбара). Методом тыков обнаружил что если перед выполнением потока сделать this->cxGrid1->Visible = false; и после его выполнения соответственно this->cxGrid1->Visible = true;, то все отрабатывает без Access violationОВ. Ктонибудь сталкивался с подобной проблемой? |
| Автор: borisbn 27.7.2010, 16:54 |
| Если ты из потока вызываешь VCL-компоненты, то понятно, что у тебя всё падает. Этого делать нельзя. Чтобы из отдельного потока добираться к визуальным компонентам нужно 1. Наследоваться от TThread 2. Написать функцию Execute 3. Сделать в ней невизуальные действия 4. Вызвать Synchronize( drawOnGrid ) 5. А уже в функции drawOnGrid дёргать VCL-компоненты кури TThread и Synchronize |
| Автор: 0x00 28.7.2010, 07:02 | ||
я конечноже пробывал и стандартный билдеровский tthread. от Synchronize( drawOnGrid ) нету толка, он блокирует доступ к обьектам над которыми производятся операции и программа всеравно зависает при поиске |
| Автор: 0x00 28.7.2010, 07:30 | ||||
| Ура! Нашел решение. программа вываливается при прорисовке грида. перед запуском потока
и самое интересное в потоке sql запрос не в synchronize. в synchronize только прорисовка грида)
|
| Автор: mrbrooks 28.7.2010, 07:59 | ||
что бы не делать таких открытий, рекомендую внимательней читать документацию или специализированную литературу. в ней все черным по белому написано зачем нужен Synchronize |