C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Форма поверх всех окон, При загруженности не прорисовывается
telepath
Отправлено: 08.06.2004, 10:30


Станционный диспетчер

Группа: Участник
Сообщений: 132



Если на форме лежит токо ProgressBar и пара лейблов, при громоздких вычислениях (ProgressBar должен показывать их прогресс) — лэйблов вообще не видно, а форма до конца не прорисовывается. Это можно как-то решить?

Заранее благодарен
AVC
Отправлено: 08.06.2004, 10:40


Ветеран

Группа: Модератор
Сообщений: 1583



А Application->ProcessMessages() делаетcя?
А метод Update() не забыт?
Gedeon
Отправлено: 08.06.2004, 10:44


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (AVC @ 08/06/2004, 11:42)
А Application->ProcessMessages();

Я думаю этого достаточно будет.
2telepath поставте это в тело вашего цикла, где проходят вычисления.
telepath
Отправлено: 08.06.2004, 10:53


Станционный диспетчер

Группа: Участник
Сообщений: 132



Большое спасибо, помогло
AVC
Отправлено: 08.06.2004, 11:16


Ветеран

Группа: Модератор
Сообщений: 1583



2Gedeon Update часто можно использовать без ProcessMessages
Пример
CODE

Lbl1->Caption = "";
Update();
for (int j = 1; j < 0x10000; j++)
{ for (int i=1; i < 0xF0000; i++);
   Lbl1->Caption = AnsiString(j);
/* комментировать сдесь*/  //  Update();
}
Lbl1->Caption = "Ok";
Gedeon
Отправлено: 08.06.2004, 11:38


Ветеран

Группа: Модератор
Сообщений: 1742



QUOTE (AVC @ 08/06/2004, 12:18)
2Gedeon Update часто можно использовать без ProcessMessages
Пример
CODE

Lbl1->Caption = "";
Update();
for (int j = 1; j < 0x10000; j++)
{ for (int i=1; i < 0xF0000; i++);
Lbl1->Caption = AnsiString(j);
/* комментировать сдесь*/ // Update();
}
Lbl1->Caption = "Ok";

Да я то и не против этого, написано для конкретно этого случая. Вообще говоря выбор того или иного метода зависит от расчетов и самой формы(че и сколько надо перерисовывать).
AVC
Отправлено: 08.06.2004, 11:47


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Вообще говоря выбор того или иного метода зависит от расчетов и самой формы(че и сколько надо перерисовывать).

Полностью поддерживаю. Владеть надо если не всем, то многим, а использовать то что удобнее сейчас.
klen
Отправлено: 08.06.2004, 12:24


Машинист паровоза

Группа: Участник
Сообщений: 239



Все это конечно хорошо. Но если расчетов много, например статистика какогонибудь иммитационного моделирования набирается, то лишний выхов ProcessMessages или Update — не пришли ли сообщения в очередь. Причем беда в том что куча сообщений приходит, выбирается из очереди, анализируется и тут.....оказывается что на него 99% их еагировать программе не надо. ИХМО надо поток делать отдельный для вычислений, а его функцию на асме писать:). Проверял по скорости (моделировал сопровождение цели РЛС — свои замудки), в общем и целом так — как выше сказано 42 минуты считалось, переписал с отдельным потоком — 24 минуты, почти в два раза быстрее. Теперь только так делаю.


ЗЫ. Если это детские расчеты — ProcessMessages однозначно и не парится.
Gedeon
Отправлено: 08.06.2004, 13:06


Ветеран

Группа: Модератор
Сообщений: 1742



Ну и опять же все от расчетов зависит. Вот про это тема тут мусолиться на примере загрузки проца чтением файлов.
Георгий
Отправлено: 08.06.2004, 23:27


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE
Проверял по скорости (моделировал сопровождение цели РЛС — свои замудки), в общем и целом так — как выше сказано 42 минуты считалось, переписал с отдельным потоком — 24 минуты, почти в два раза быстрее
а поток через Win32API или TThread? Дело в том, что Win32API быстрее ~%30 чем TThread.

Вернуться в Вопросы программирования в C++Builder