|
Проблемы с GUI в C++Builder 5 |
|
|
|
Jan 10 2011, 15:32
|
Группа: Участник
Сообщений: 13
Регистрация: 27-04-07
Пользователь №: 27 368

|
Разработана в среде С++Builder 5 программа управления неким устройством через USB. Программа выводит на экран окна с текстовой и графической информацией. Все идеально работает под Билдером, однако, если запустить файл exe вне Билдера, при выполнении некоторых операций на экране появляются белые прямоугольники. Попытка реализовать многопотоковый режим к успеху не привела, при этом эффекты появляются даже под Билдером. Вопрос: что привносит Билдер в мою программу, позволяющее ей безупречно работать с одним потоком? Может, кто сталкивался с подобной проблемой и решил ее, подскажите, в каком направлении искать? Спасибо, кто дочитал до конца!
|
|
|
|
|
 |
Ответов
(1 - 11)
|
Jan 11 2011, 15:21
|
Группа: Участник
Сообщений: 13
Регистрация: 27-04-07
Пользователь №: 27 368

|
Добрый вечер, спасибо за проявленный интерес к моей проблеме. Белые прямоугольник - судя по всему - результат того, что процессор не успевает прорисовать все детали, которые должны быть на экране. Прямоугольник закрывает одно из рабочих окон, (например, окно редактора) то одно, то другое, а может и не закрыть. При этом программа продолжает выполнять текущую операцию без отображения на экране хода ее выполнения. После завершения экран полностью восстанавливается. Внешнее устройство работает медленно, поэтому для синхронизации его с программой многократно использую Sleep( от 30 до 300). Наличие или отсутствие отладчика не влияет, проверял.
|
|
|
|
|
Jan 11 2011, 16:31
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(Kayur @ Jan 11 2011, 21:21)  с программой многократно использую Sleep( от 30 до 300). Если вы под OWLем пишите, то попробуйте вместо Sleep() вызывать: GetApplication()->PumpWaitingMessages(); Там, внутри этой функции все сделано, как надо. Но если цикл какой-то длинный крутите, но на каждом обороте ее вызывать не надо, а то замедление сильное будет. Но если нет другой возможности, то в длинном цикле ее можно вызывать периодически, через неколько оборотов. Например так: Код for( int i=0; i < 10000000; i++) // цикл на 10 млн. оборотов { ................... // что-то делаете в цикле
if( i%1000==0) GetApplication()->PumpWaitingMessages(); // вызывем один раз через каждые 1000 оборотов цикла } Просто Sleep() в этой ситуации может не помогать, т.к. тормоза не с апдейтом картинки, а с прорисовкой "самодельных" элементов (например, функцией Paint). Тогда в условиях захвата времени в вычислительных циклах, очередь сообщений стоит на месте, и сообщения WM_PAINT тоже не обслуживаются. Вот и получаем белые квадратики.
|
|
|
|
|
Jan 11 2011, 17:18
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Цитата Прямоугольник закрывает одно из рабочих окон, (например, окно редактора) то одно, то другое, а может и не закрыть. При этом программа продолжает выполнять текущую операцию без отображения на экране хода ее выполнения. Т.е. вместо этого прямоугольника по идее у вас должно было быть окошко с отображением хода выполнения? Что за окошко? как показываете его? Цитата Тогда в условиях захвата времени в вычислительных циклах, очередь сообщений стоит на месте, и сообщения WM_PAINT тоже не обслуживаются. Ну так Application->ProcessMassages(); как раз самое оно для таких случаев ))) А вообще да, конечно по уму надо эти медленные операции все в отдельный поток, чтоб ГУЙ не тормозили. Application->ProcessMesages(); к примеру не спасёт, если кто-то нажал на кнопку(отмена к примеру). Обработчик события от этой кнопки будет вызван только по завершении цикла(порою длинного и долгого). Так что тут как ни крути, даже если с прямоугольниками разобраться, всё равно, наверное, придётся второй поток организовывать...
--------------------
The truth is out there...
|
|
|
|
|
Jan 12 2011, 14:33
|
Группа: Участник
Сообщений: 13
Регистрация: 27-04-07
Пользователь №: 27 368

|
Непонятно, что делает Application->ProcessMessages(), как ее применять? В Help на нее ничего нет. Примерчик бы...
|
|
|
|
|
Jan 13 2011, 17:33
|
Группа: Участник
Сообщений: 13
Регистрация: 27-04-07
Пользователь №: 27 368

|
Честно говоря, не верил, что обращение на форум приведет к успеху. SigmaN, тебе а-а-громное СПАСИБО за Application->Messages! Все получилось сразу и легко после установки Application->Messages в длинные и медленные циклы, без всяких там дополнительных потоков. Спасибо всем, тема закрыта.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|