Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2011, 09:15   #1
oxotnik110
Новичок
Джуниор
 
Регистрация: 12.08.2011
Сообщений: 2
Вопрос C++ Builder визуализация процесса (ProgressBar и т.д.)

Добрый день, уважаемые спецы-программисты!
Всегда старался сам решать проблемы с кодом, но силы мои иссякли, потому обращаюсь к вам за помощью.

И так задача:
Программа работает с сервером MySQL и при нажатии пунктов списка выполняет запросы к базе и выводит данные в таблицу.
Необходимо каким-то образом визуализировать процесс чтения данных из БД, т.к. это занимает ощутимое время и визуально кажется, что программа не среагировала на выбор пункта списка, пока через какое то время считанные данные не отобразятся в таблице.

Как я пытался решить проблему:
1. Создавал отдельную маленькую форму (назовем ее Form2), на которой была только одна метка с текстом "Загрузка данных...". В процедуре выбора пункта списка (т.е. в функции которая выполняется при выборе пункта списка пользователем) в самом начале прописывал Form2->Show(); А в процедуре заполнения таблицы данными, в конце прописывал Form2->Hide(); Технически все работает правильно, НО проблема в том, что форма отображается как серый прямоугольник, метка не отображается, хотя ее свойство Visible = true. Т.е. получается программа просто не успевает отрисовать метку, т.к. уже занимается процессом чтения данных из БД. Пробовал ставить паузу после открытия формы. Не помогло
2. Я пошел дальше, решил впихнуть отображение формы в отдельный поток. Та же ерунда, только еще хуже, форма отображалась ПОСЛЕ чтения данных, а не во время, хотя по логике процесса должна была отображаться во время чтения. Пробовал разные типы потоков и тот который сразу стартует и "замороженный", пускал его перед чтением данных.
3. Пробовал вместо формы и отображать Panel с текстом. Та же история как и с формой. Серый прямоугольник. И ProgressBar пробовал. Не показывает процесс.
4. Менял приоритет потока на более высокий и даже на критический. Не помогло
5. Пробовал через Таймер (со значением от 50 до 2) все это делать. Такая же фигня. Только еще и с большим тормозом.

Вобщем уже не знаю, в какую сторону копать. Книги и форумы не помогают Нигде нет ответов и решений...
Подскажите, как решить проблему?!
ЗЫ: Скажу сразу, код написан правильно, проблема где то в логике подхода, в самом алгоритме.

За ранее огромное спасибо за помощь!
С уважением, Александр.
oxotnik110 вне форума Ответить с цитированием
Старый 12.08.2011, 11:24   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

> проблема где то в логике подхода

это точно. Проблема в том, что SQL запрос, выполненяемый в главном потоке, завешивает GUI вашего приложения. Можно хоть обвешаться таймерами, потоками и прочими штучками, но пока SQL не вернёт управление главному потоку, ничего отрисовано не будет.

Отсюда выводы:

1) если у вас много коротких (по времени) запросов, ставьте между ними Application.ProcessMessages();. Это позволит GUI отрисовываться хоть иногда.

2) если у вас один длительный запрос, выносите его в отдельный поток. Это сложнее, чем кажется на первый взгляд (на сколько я помню, все операции с базой нужно будет делать только в этом потоке, в том числе открытие и т.д.), но если оно заработает, будет всем хорошо.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 12.08.2011, 11:41   #3
oxotnik110
Новичок
Джуниор
 
Регистрация: 12.08.2011
Сообщений: 2
По умолчанию

Хм... Так я и думал, что тут простого решения нету...
Подвешивают в основном запросы всей БД, они ощутимые по времени, а когда читается часть БД (выборка по отдельным строкам), то тут всё норм и необходимости в индикации процесса нету.
Вынести всё связанное с запросами в отдельный поток будет ОООООчень сложно. Слишком во многих местах переплетается программа с запросами. Буду искать альтернативные варианты решения проблемы.
И попробую просто вынести "тяжелые" запросы в отдельный поток, может прокатит... Чето я сразу как то до этого не додумался. Спасибо за совет!
oxotnik110 вне форума Ответить с цитированием
Старый 19.08.2011, 11:47   #4
sergey_dmitrievich
Пользователь
 
Регистрация: 13.07.2011
Сообщений: 40
По умолчанию

У себя это проблему решил одной строчкой:
StatusBar1->SimpleText="SELECT...";
Ну и можно еще курсор на часики поменять перед длительным запросом.
sergey_dmitrievich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Визуализация графа 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