реклама на сайте
подробности

 
 
> Проблемы с GUI в C++Builder 5
Kayur
сообщение Jan 10 2011, 15:32
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 27-04-07
Пользователь №: 27 368



Разработана в среде С++Builder 5 программа управления неким устройством через USB.
Программа выводит на экран окна с текстовой и графической информацией.
Все идеально работает под Билдером, однако, если запустить файл exe вне Билдера,
при выполнении некоторых операций на экране появляются белые прямоугольники.
Попытка реализовать многопотоковый режим к успеху не привела, при этом эффекты появляются
даже под Билдером.
Вопрос: что привносит Билдер в мою программу, позволяющее ей безупречно работать с одним
потоком? Может, кто сталкивался с подобной проблемой и решил ее, подскажите, в каком
направлении искать? Спасибо, кто дочитал до конца!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 11)
sigmaN
сообщение Jan 10 2011, 16:35
Сообщение #2


I WANT TO BELIEVE
******

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



прямоугольники где именно? не прорисовывается содержимое окна? отдельные контролы? при выполнении каких именно операций?
а лучше скриншот бы ещё.
И вот прямо так белые сразу и появляются?
Нужно больше информации в общем....


Что привносит Билдер.... даже не знаю...под присмотром отладчика прога вертится....что он ещё может привнести то....

может ли быть такое, что под билдером и в рантайме - прога разные версии dll цепляет? Опции компиляции одинаковы?


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jan 10 2011, 17:23
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Белые прямоугольнички - это скорее всего зависшая прорисовка элементов управления.

Типа, создавая многопоточное приложение вовсю и смело используйте команду Sleep. Причем, если не знаете куда ее ставить - ставьте куда попало. Все лучше будет.


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 11 2011, 04:20
Сообщение #4


I WANT TO BELIEVE
******

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



а ещё Application->ProcessMesages(); в длинных циклах почаще вызывать )
Только вот всё равно это такие советы все пальцем в небо.... мало данных. мало.


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Kayur
сообщение Jan 11 2011, 15:21
Сообщение #5





Группа: Участник
Сообщений: 13
Регистрация: 27-04-07
Пользователь №: 27 368



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

Go to the top of the page
 
+Quote Post
DpInRock
сообщение Jan 11 2011, 16:21
Сообщение #6


Гуру
******

Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515



Значить слип не в потоке.
Достаточно 1-10 слипа.

Кроме того, такое случается, если вы ухитряетесь в события вставить что-то неправильное. Тогда вообще будет висеть...

Кроме того, надо умеючи обновлять графический интерфейс (основной поток) из дочернего.

Приоритет дочерних потоков не надо задирать.
--
Короче, набор совершенно очевидных вещей.
И если они вам известны - просто ищите ошибки. Больше ничего.

Сообщение отредактировал DpInRock - Jan 11 2011, 16:22


--------------------
On the road again (Canned Heat)
Go to the top of the page
 
+Quote Post
Xenia
сообщение Jan 11 2011, 16:31
Сообщение #7


Гуру
******

Группа: Модератор 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 тоже не обслуживаются. Вот и получаем белые квадратики.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 11 2011, 17:18
Сообщение #8


I WANT TO BELIEVE
******

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



Цитата
Прямоугольник закрывает одно из рабочих окон,
(например, окно редактора) то одно, то другое, а может и не закрыть.
При этом программа продолжает выполнять текущую операцию без
отображения на экране хода ее выполнения.
Т.е. вместо этого прямоугольника по идее у вас должно было быть окошко с отображением хода выполнения? Что за окошко? как показываете его?

Цитата
Тогда в условиях захвата времени в вычислительных циклах, очередь сообщений стоит на месте, и сообщения WM_PAINT тоже не обслуживаются.
Ну так Application->ProcessMassages(); как раз самое оно для таких случаев )))

А вообще да, конечно по уму надо эти медленные операции все в отдельный поток, чтоб ГУЙ не тормозили. Application->ProcessMesages(); к примеру не спасёт, если кто-то нажал на кнопку(отмена к примеру). Обработчик события от этой кнопки будет вызван только по завершении цикла(порою длинного и долгого). Так что тут как ни крути, даже если с прямоугольниками разобраться, всё равно, наверное, придётся второй поток организовывать...


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Kayur
сообщение Jan 12 2011, 14:33
Сообщение #9





Группа: Участник
Сообщений: 13
Регистрация: 27-04-07
Пользователь №: 27 368



Непонятно, что делает Application->ProcessMessages(), как ее применять?
В Help на нее ничего нет. Примерчик бы...
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 12 2011, 14:58
Сообщение #10


I WANT TO BELIEVE
******

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



Лентяй Вы )))
http://www.delphihelp.org/processmessages.html
http://forum.vingrad.ru/forum/s/d73c7ca0b8...y1685334/0.html
а вот тут даже "тёмную сторону" обсуждают
http://delphi.about.com/od/objectpascalide...s-dark-side.htm

в этом случае вообще не важно Delphi или Builder - только синтаксис разный...суть остаётся такой же )


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
Kayur
сообщение Jan 13 2011, 17:33
Сообщение #11





Группа: Участник
Сообщений: 13
Регистрация: 27-04-07
Пользователь №: 27 368



Честно говоря, не верил, что обращение на форум приведет к успеху.
SigmaN, тебе а-а-громное СПАСИБО за Application->Messages!
Все получилось сразу и легко после установки Application->Messages
в длинные и медленные циклы, без всяких там дополнительных потоков.
Спасибо всем, тема закрыта.
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Jan 15 2011, 07:13
Сообщение #12


I WANT TO BELIEVE
******

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



Нет, форум - это сила.
Я свой первый самостоятельный проект ни за что бы не осилил без форума)


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 09:06
Рейтинг@Mail.ru


Страница сгенерированна за 0.01478 секунд с 7
ELECTRONIX ©2004-2016