Easyelectronics.ru

Электроника для всех
Текущее время: 27 июл 2017, 11:48

Часовой пояс: UTC + 5 часов



    • The World's Cheapest PCB Prototyping: 10 шт. 2-слоя 100*100mm 2$(около 140rub), изготовление за 24 часа.
    • Создание принципиальных схем и проектирование печатных плат
    • Крупнейший китайский онлайн магазин радиодеталей. Скидка 50%
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: windows - вывод графика в свернутое окно [решено, кг/ам]
СообщениеДобавлено: 21 апр 2017, 05:06 
Свой человек
Аватара пользователя

Зарегистрирован: 05 сен 2012, 12:00
Сообщения: 125
Откуда: МО, Солнечногорск
возможно, кто-то уже сталкивался и победил, а у меня трехдневное гугление пока оказалось безрезультатным:(

ситуация следующая - есть программка, которая собирает данные с некоего девайса и рисует картинку и график

написано под Win 10 с помощью Lazarus

есть основное окно с картинкой типа TPanel и всякими кнопками для управления процессом - FormM
есть еще одно окно с графиками - FormG, на нем 3 TAChart`а, на каждом по 2 серии.

создаются они так:

Show



FormP это окно настроек и с ним все хорошо

данные считываются раз в 2 секунды по таймеру программы, обрабатываются, и строятся графики

т.е. раз в 2 секунды вызывается
Show



И иногда, ВНЕЗАПНО, график хочется свернуть. И если его сворачивать его же кнопкой "свернуть" и разворачивать как "восстановить" (ВАРИАНТ 1)- то все хорошо.

Смотрел сообщения окну с помощью Windows Detective

При таком способе сворачивания - что развернутому, что свернутому окну идут такие сообщения (основная отрисовка окна):

Show


и, повторюсь, все хорошо

А если (ВАРИАНТ 2) я сворачиваю окно как
Код:
ShowWindow(FormG.Handle, SW_SHOWMINIMIZED);


и разворачиваю его потом как
Код:
ShowWindow(FormG.Handle, SW_NORMAL);


то при свернутом окне график не отрисовывается. Проявляется это в следующем - когда окно разворачиваю обратно - точки за время "свернутости" окна пропадают, и начинаются с момента когда окно развернется.

При этом, судя по Windows Detective, никакие сообщения к окну FormG не идут

Upd. посмотрел также с помощью MS Spy++. Если верить ему, то вышеописанные сообщения идут не к FormG, а к одному из Chart`ов. Но общая суть не меняется.

Попытки принудительно послать окну с помощью SendMessage WM_PAINT , да и вообще хоть что-нибудь успехом не увенчались. Всяческие UpdateWindow, .Refresh, .Repaint, .Update, InvalidateRect, EnableWindow, RedrawWindow, PrintWindow, SetForegroundWindow, BringWindowToTop, SetWindowPos, а также SwitchToThisWindow в теле функции GraphView - тоже безуспешно.

Делать каждый раз окно видимым не айс. Да и вообще, ВАРИАНТ 1 же прекрасно работает.

Вопрос классический - что я делаю не так и куда копать?

_________________
Даже если сложить в одну кучу поле капусты, все равно коллективного разума не получится.


Последний раз редактировалось madmazy 22 апр 2017, 15:18, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: windows - вывод графика в свернутое окно
СообщениеДобавлено: 21 апр 2017, 08:19 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3434
Откуда: г. Липецк
madmazy писал(а):
... И если его сворачивать его же кнопкой "свернуть" и разворачивать как "восстановить" (ВАРИАНТ 1)- то все хорошо...

Не понял про ВАРИАНТ 1, разве у Chart есть такая кнопка?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: windows - вывод графика в свернутое окно
СообщениеДобавлено: 21 апр 2017, 10:11 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2140
Откуда: Санкт-Петербург
По ощущениям - примерно всё.
Давненько я не писал под винду, но вызываемый раз в две секунды код с "ProcessMessages" как бы намекает.

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

А если данные раз в 2 секунды собирать надо (и много времени на это не уходит) - то можно по таймеру.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: windows - вывод графика в свернутое окно
СообщениеДобавлено: 21 апр 2017, 14:12 
Свой человек
Аватара пользователя

Зарегистрирован: 05 сен 2012, 12:00
Сообщения: 125
Откуда: МО, Солнечногорск
anakost, у Chart нет, а у FormG, на которой он расположен - есть.

aamonster, можно подробнее, я ненастоящий сварщик:)
Смысл в том, что на главной FormM в процедуре обработки нажатия кнопки "Сбор данных" запускается цикл, из которого выходим по флагу от кнопки "Стоп".
В этом цикле проверяется флаг таймера, по флагу делается прием данных (8 штук 4х байтовых float на скорости 19600), далее не бог весть какие расчеты и вызывается отрисовка графика. Во все свободные места в этом цикле заполнены ProcessMessages, примерно так, не вдаваясь в подробности:

Show


вот DataView - это расчеты, и оттуда же вызывается отрисовка графика. В общем-то, почти все время управление отдано винде, в моем понимании.

то есть, вроде бы то самое получается
Цитата:
если данные раз в 2 секунды собирать надо (и много времени на это не уходит) - то можно по таймеру.



Потоки я, к своему стыду, пока не умею. В смысле не пробовал. Ну не возникало нужды никогда:)

И, самое -то главное! ВАРИАНТ 1 - то прекрасно работает!

_________________
Даже если сложить в одну кучу поле капусты, все равно коллективного разума не получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: windows - вывод графика в свернутое окно
СообщениеДобавлено: 21 апр 2017, 20:25 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 3434
Откуда: г. Липецк
Ну так и имитируйте нажатия на кнопки
Код:
  PostMessage(FormG.Handle, WM_SYSCOMMAND, SC_MINIMIZE, 0);
  PostMessage(FormG.Handle, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
  PostMessage(FormG.Handle, WM_SYSCOMMAND, SC_RESTORE, 0);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: windows - вывод графика в свернутое окно
СообщениеДобавлено: 21 апр 2017, 22:41 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 2993
Что мешает взять и перерисовать самому?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: windows - вывод графика в свернутое окно
СообщениеДобавлено: 22 апр 2017, 14:40 
Свой человек
Аватара пользователя

Зарегистрирован: 05 сен 2012, 12:00
Сообщения: 125
Откуда: МО, Солнечногорск
anakost, неа, ноль эмоций, все то же самое.

u37, а как именно? заново вывести весь график в ставшее активным развернутым окно? Можно, конечно, но вот от этого как раз хочется уйти...


Вообще мне кажецо, что сворачивание-разворачивание окна по варианту 1 и по варианту 2 происходит по-разному. Если я сверну по варианту 1 а разверну по варианту 2, то график вообще перестает отображаться начиная с момента сворачивания. Если же после описанных действий дополнительно развернуть по варианту 2, то график начинает отображаться, но, как и было, с потерей данных

_________________
Даже если сложить в одну кучу поле капусты, все равно коллективного разума не получится.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: windows - вывод графика в свернутое окно
СообщениеДобавлено: 22 апр 2017, 15:16 
Свой человек
Аватара пользователя

Зарегистрирован: 05 сен 2012, 12:00
Сообщения: 125
Откуда: МО, Солнечногорск
Господа, извините, что отнял ваше время. Я идиот.

Все дело было в строчке

Код:
//отображение графиков
if (FormM.GraphCheckBox.Checked=true) then GraphView();


в процедуре DataView();

А все сворачивания-разворачивания окна как раз производились в обработчике изменения FormM.GraphCheckBox

То есть я сам же запрещал вывод графика:(

Посыпаю голову пеплом в осознании собственной тупизны и обещаю больше не кодить во время ОРЗ:(

_________________
Даже если сложить в одну кучу поле капусты, все равно коллективного разума не получится.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB