|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.08.2011, 09:15 | #1 |
Новичок
Джуниор
Регистрация: 12.08.2011
Сообщений: 2
|
C++ Builder визуализация процесса (ProgressBar и т.д.)
Добрый день, уважаемые спецы-программисты!
Всегда старался сам решать проблемы с кодом, но силы мои иссякли, потому обращаюсь к вам за помощью. И так задача: Программа работает с сервером MySQL и при нажатии пунктов списка выполняет запросы к базе и выводит данные в таблицу. Необходимо каким-то образом визуализировать процесс чтения данных из БД, т.к. это занимает ощутимое время и визуально кажется, что программа не среагировала на выбор пункта списка, пока через какое то время считанные данные не отобразятся в таблице. Как я пытался решить проблему: 1. Создавал отдельную маленькую форму (назовем ее Form2), на которой была только одна метка с текстом "Загрузка данных...". В процедуре выбора пункта списка (т.е. в функции которая выполняется при выборе пункта списка пользователем) в самом начале прописывал Form2->Show(); А в процедуре заполнения таблицы данными, в конце прописывал Form2->Hide(); Технически все работает правильно, НО проблема в том, что форма отображается как серый прямоугольник, метка не отображается, хотя ее свойство Visible = true. Т.е. получается программа просто не успевает отрисовать метку, т.к. уже занимается процессом чтения данных из БД. Пробовал ставить паузу после открытия формы. Не помогло 2. Я пошел дальше, решил впихнуть отображение формы в отдельный поток. Та же ерунда, только еще хуже, форма отображалась ПОСЛЕ чтения данных, а не во время, хотя по логике процесса должна была отображаться во время чтения. Пробовал разные типы потоков и тот который сразу стартует и "замороженный", пускал его перед чтением данных. 3. Пробовал вместо формы и отображать Panel с текстом. Та же история как и с формой. Серый прямоугольник. И ProgressBar пробовал. Не показывает процесс. 4. Менял приоритет потока на более высокий и даже на критический. Не помогло 5. Пробовал через Таймер (со значением от 50 до 2) все это делать. Такая же фигня. Только еще и с большим тормозом. Вобщем уже не знаю, в какую сторону копать. Книги и форумы не помогают Нигде нет ответов и решений... Подскажите, как решить проблему?! ЗЫ: Скажу сразу, код написан правильно, проблема где то в логике подхода, в самом алгоритме. За ранее огромное спасибо за помощь! С уважением, Александр. |
12.08.2011, 11:24 | #2 |
Старожил
Регистрация: 03.01.2011
Сообщений: 2,508
|
> проблема где то в логике подхода
это точно. Проблема в том, что SQL запрос, выполненяемый в главном потоке, завешивает GUI вашего приложения. Можно хоть обвешаться таймерами, потоками и прочими штучками, но пока SQL не вернёт управление главному потоку, ничего отрисовано не будет. Отсюда выводы: 1) если у вас много коротких (по времени) запросов, ставьте между ними Application.ProcessMessages();. Это позволит GUI отрисовываться хоть иногда. 2) если у вас один длительный запрос, выносите его в отдельный поток. Это сложнее, чем кажется на первый взгляд (на сколько я помню, все операции с базой нужно будет делать только в этом потоке, в том числе открытие и т.д.), но если оно заработает, будет всем хорошо.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
|
12.08.2011, 11:41 | #3 |
Новичок
Джуниор
Регистрация: 12.08.2011
Сообщений: 2
|
Хм... Так я и думал, что тут простого решения нету...
Подвешивают в основном запросы всей БД, они ощутимые по времени, а когда читается часть БД (выборка по отдельным строкам), то тут всё норм и необходимости в индикации процесса нету. Вынести всё связанное с запросами в отдельный поток будет ОООООчень сложно. Слишком во многих местах переплетается программа с запросами. Буду искать альтернативные варианты решения проблемы. И попробую просто вынести "тяжелые" запросы в отдельный поток, может прокатит... Чето я сразу как то до этого не додумался. Спасибо за совет! |
19.08.2011, 11:47 | #4 |
Пользователь
Регистрация: 13.07.2011
Сообщений: 40
|
У себя это проблему решил одной строчкой:
StatusBar1->SimpleText="SELECT..."; Ну и можно еще курсор на часики поменять перед длительным запросом. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Визуализация графа | LENA_M | Общие вопросы C/C++ | 11 | 21.04.2011 20:43 |
Запуск процесса в потоке, завершение процесса в указааноое время, Дайте совет | Человек_Борща | Общие вопросы Delphi | 3 | 29.08.2010 12:58 |
визуализация в Delphi | HelpMePLZ | Фриланс | 6 | 21.06.2010 17:54 |
C++ Builder 6. ProgressBar | Neadekwat | C++ Builder | 4 | 17.08.2009 20:54 |
Визуализация | ekzobyte | Мультимедиа в Delphi | 1 | 18.03.2009 18:11 |