Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Проблема с перерисовкой  (Прочитано 17285 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« : 14-07-2006 09:39 » 


Господа, может быть кто-то сталкивался с подобной проблемой:

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

есть два обычных СДИ-приложения.

Проблемы всплывают во втором приложении:
1) при старте status-bar и правый край не перерисовываются. При этом , как выяснилось, этому мешает следующее: я при старте сохраняю поинтеры на view и mainfram-e:

Код:
    

CMainFrame::CMainFrame()
: m_pOurView (NULL)
{
((CClockAppApp*)AfxGetApp())->SetOurMainFrame(this);
}


void CClockAppApp::SetOurMainFrame(CMainFrame* pFrame)
{
m_pOurFrame = pFrame;
}

/////////

CClockAppView::CClockAppView()
: m_pClockShow (NULL)
{
((CClockAppApp*)AfxGetApp())->SetOurView(this);   
}

void CClockAppApp::SetOurView(CClockAppView* pView)
{
m_pOurView = pView;

if (m_pOurFrame)
{
m_pOurFrame->SetOurView(m_pOurView);
}
}

void CMainFrame::SetOurView(CClockAppView* pView)
{
m_pOurView = pView;
}

   

   Т.е. если все ето убрать, то на старте все перерисовывается верно... Но это бред, т.к. это всего лишь передача данных и не более того! Но факт...

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

  И как это объяснить, я пока не знаю. барабашки какие-то  А черт его знает...
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 14-07-2006 14:53 » 

Иринк, а может поможет нечто вроде:

1)
//в мейн фрейме
ShowWindow(SW_SHOW);
Invalidate(0);
UpdateWindow();

-------
2) или послать мейнфрейму сообщения WM_NCPAINT и WM_PAINT  ?

-----
зы а, кстати, я так понял - не перерисовывается только при первом появлении на экране? то есть "погрызено" ?
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #2 : 14-07-2006 15:02 » 

Леш,

ну да - там видны части других окон, находившихся внизу.

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

спасибо за совет, сейчас попробую.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 14-07-2006 15:16 » 

а, возможно надо не Invalidate(0); , а Invalidate( 1 );
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #4 : 14-07-2006 15:30 » 

так, с одним разобралась - как всегда помогло кардинальное средство типа "перезагрузка" Ага Жалко, что смогла это сделать только сейчас - до этого постоянно кто-то что-то из-под меня хотел и поэтому было невозможно тронуть комп.
Ттеперь выяснилось, что как и следовало ожидать, переменные здесь ни при чем и при старте все теперь рисуется верно.
Теперь андо отгребать проблему с цветами - там я пока еще не разобралась.

Леш,

я специально вызываю с параметром 0, иначе будет слишком сильно мелькать при перерисовке.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 14-07-2006 17:22 » 

Malaja, а что с цветами? Поподробнее...
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #6 : 19-07-2006 10:04 » 

Пардон, меня тут от родного места оторвали, посему ответить вовремя не смогла.  Скромно так...

Задача выглядит так:

есть 2 приложения - основное (обрабатывающее данные) и дополнительное (представляющее эти данные в виде различных схем и графиков). В основном при определенных условиях надо взять определенные данные (2 вида) и переслать их дополнительномы приложению. Т.о. поддерживается связь между обоими приложениями, что в свою очередь позволяет говорить о том, что данные во втором приложении всегда актуальны.

В основном приложении перед передачей данных запускается таймер (для циклической передачи данных одного вида) и процесс с тем же периодом, что и таймер  (для циклической передачи данных другого вида). 
В дополнительном в этот момент должны стартовать часы (как отдельный диалог), показывающие период обновления данных (тоже с таймером, период которого = период таймера из основного приложения / 10, чтобы было удобно двигать стрелки каждый раз на 6 мин.). При этом в начале передачи данных часы должны иметь один цвет (темнозеленый), а после окончания передачи данных другой
(светлозеленый). Т.о. пользователь может определить, что данные находятся в стадии передачи или refresh завершен.

Проблемы:
 - цвет показывается не всегда верно,
 - стрелки на часах перерисовываются не всегда.
Итого - что-то не так с перерисовкой. А вот что?
Я уже пробовала таймер в дополнительном приложении завязывать не на OnTimer(), а на процедуру, чтобы избежать задержек и накладок. Но меня это тоже не спасло.  А черт его знает...
Короче - что-то я делаю не так, но не знаю что.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 19-07-2006 14:57 » 

Ирин, во первых непонятно, зачем приложений два, а не просто 2 потока, но это ладно. В остальном - нужна отладка, пришли код (упрости по максимуму, все секреты фирмы убери) скинь на ящик мне, покумекаем Улыбаюсь

такое ощущение, что отрисовка у тебя не в OnPaint...

а, кстати, каким образом осуществляется связь мж приложениями?
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #8 : 19-07-2006 18:11 » 

Я что-то тоже никак сообразить не могу, ещё шум прибоя в ушах не стих, посему код в студию (или на мыло).
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 19-07-2006 18:15 » 

Джон, какой-такой шум? Улыбаюсь))
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #10 : 20-07-2006 07:25 » 

Люди,

я хотела сразу код в студию, но не нашла, как... Подскажите!!!
Сразу по поводу кода - я сделала пробник, на котором это все отлаживаю, посему никаких секретов там нет.
Почему приложений 2 - в этом я не виновата, так сложилось исторически Ага
В реальности связь осуществляется следующим образом - для вспомогательного приложения сгенерирован вреппер-класс, который используется основным приложением. Я сделала попроще, чтобы с этим не возиться Ага

Джон, видимо, прибой был хороший! Ага
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 20-07-2006 08:01 » 

Malaja, тогда хоть проги пришли, чтоб понять визуально-то, в чём непонятка Улыбаюсь
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #12 : 20-07-2006 09:33 » 

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

Джон, видимо, прибой был хороший! Ага

Не то слово, в последний день такой ветер поднялся! Километров эдак 90 в час. Ну и на море шторм был. Даже сёрферам запрещено было в воду лезть. Фотки подготавливаются.
« Последнее редактирование: 20-07-2006 09:36 от Джон » Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #13 : 20-07-2006 10:04 » 

так замуж же ходить легче, чем по жаре искать, где и как файл подвесить Ага
о, нашла! Ну жарко мне, мозги не варят Ага

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

* ClockApp.zip (47.13 Кб - загружено 786 раз.)
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #14 : 20-07-2006 15:02 » 

Ирэн,
#include "GlobalConst.h"
пришли, однако Улыбаюсь
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #15 : 20-07-2006 15:09 » 

безголовая, я, однако Ага "И он понял, что его сейчас будут бить, причем преимущественно ногами" (С) пардон Ага

* GlobalConst.h (2.37 Кб - загружено 784 раз.)
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 20-07-2006 15:16 » 

Malaja, ну зачем же ногами то, какое вАрварство Улыбаюсь
Записан

Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #17 : 20-07-2006 15:25 » 

вообще-то, с немецким у меня плохо Улыбаюсь

а так - часы тикают, каждый круг - темнеют и делается ЧТО-ТО,
никаких зависов не вижу...

А вообще, для решения таких проблем - часы надо запустить в отдельном
потоке, и там по таймеру вызывать перерисовку.  А вернее - не по таймеру
(это ведь тоже сообщения), лучче Sleep. И, конесно, поток должен следить
за желанием окружающих прервать его и остановить.

Либо вариант - в цикле, где идут вычисления, периодически прорисовывать
окошко с часами, или подкачивать сообщения
Код:
    MSG msg;
    while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
      if(!IsDialogMessage(&msg))
      {
        TranslateMessage(&msg);
        DispatchMessage(&msg); 
      }
    }

но при подкачке надо следить за шаловливыми ручками юзера - чтоб не закрыл проги или ещё чего. Выстави некий флаг и руби попытки на корню...
Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #18 : 21-07-2006 09:22 » 

Леш,

первое-извини меня, заразу, просто я этот пример потом должна положить к ним в систему, следящую за версиями (типа соурцесафе в студии), плюс потом надо будет этот код кусками сразу загонять в реальный проект, а комментарии обязательны, посему я в автомате сразу их написала на немезком (они требуют, чтобы все было на одном языке-английском или немезком, но т.к. проект уже старый, там все изначально писали на немезком, поэтому мне тоже надо поддерживать традиции Ага )

как это ничего не наблюдаешь???
Порядок действий для наблюдения за безобразиями следующий:
- стартовать основное приложение,
- на основном в меню выбрать пункт "test", там "test starten"
- на диалоге нажать кнопку "starten ClockApp", при этом стартанет второе и начнется бардак Ага
- и вот тут ты все и видишь - стрелка на часах не делает полный оборот, а может скакануть с 20мин на 12 часов,  цвет меняется не всегда в соответствии с той логикой, которую заложила я.
 
По поводу процессов:
я пробовала использовать мультимедийный таймер, который, елси верить MSDN, живет в своем личном процессе.
Но меня это тоже не спасло, т.к. перерисовка осуществляется в другом процессе, т.е. в диалоге. ;-(
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #19 : 21-07-2006 15:06 » 

Ирина, если я правильно понял,  у меня ничего не скачет. Кстати, второе приложение само не запускается Улыбаюсь Ну это ладно - я его запустил сам.
Заметил, что иногда загрузка проца становится 100% - это и есть источник твоих проблем, видать комп у тебя слабее, и обработка сообщений приостанавливается на слишком долго. 
Выход у тебя один:

в большОм цикле обработки твоих данных надо делать Sleep(1) (если это другой поток по отношению к окошку с часами) или ну опять-таки принудительную прорисовку окна с часами прямым вызовом обработчика OnPaint (а не через мазафакасообщения),  то есть опять так

pЧасы->UpdateWindow();
pЧасы->Invalidate(0);

В коде я не понял, где именно находятся тяжёлые вычисления, подскажи, в какой апликашке и какой процедуре

Записан

Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #20 : 21-07-2006 21:23 » 

Леш,

самое интересное, что мой комп на работе весьма неслабой конфигурации, посему меня это тоже несколько смущает.
Насчет второго приложения-кажется, я закомментировала старт через SHell..., т.к. пыталась понять разницу в результатах (как оказалось-никакой).
Насчет вычислений:
в проекте в основном приложении данные считываются из файлов или списков и каждое данное в отдельности посылается дополнительному приложению, которое в свою очередь эту информацию принимает и обрабтывает определенным образом, а результатом служит создание определенных схем.
В примере:
в основном проиложении я сделала 2 функции - одна стартует  из ontimer, вторая-через thread (имена точно сейчас не помню, что-то типа sendinfo). Смена цвета часов - что-то типа changecolourofclock.
в дополнительном приложении в mainframe я принимаю эти сообщения и посылаю их дальше не то сразу диалогу, не то во view, который в свою очередь посылает их диалогу (точно не помню, а дома копии нет, забыла скачать).
Я пыталась сделать мультимедийный таймер и из его callback-функции вызывать OnPaint(), но это тоже не помогло. pЧасы->UpdateWindow() и pЧасы->Invalidate(0) тоже не сработало... Последние 2 функции все равно есть не что иное, как завуалированное wm_paint, а когда они выстариваются в очередь, то превращаются в одно.
Что я не успела попробовать-это Sleep, я не понайла, куда его ставить, хотела тебя спросить, но не успела. А сейчас ты в своем посте это объяснил. Если не дадут дома попробовать, сделаю в понеделъник на работе.

Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #21 : 22-07-2006 04:03 » new

ой, Иринка, я тупанул, надо в другой посл-ти:

pЧасы->Invalidate(0);
pЧасы->UpdateWindow(); // это не сообщение, тут НАПРЯМУЮ вызов


Про Sleep - это я предполагаю вот что:

один поток много вычисляет (то есть проц занимает на 100%)
другой поток показывает часы (им осталось понты %)

надо в вычисления где то вставить небольшой слип, чтоб несколько процентов перетекло к часам, например такие вычисления:
Код:
for(int i=0;i<1000;i++)
{
   //вот тут слип
   Sleep(1);

   for(int k=0;k<1000000000;k++)
   {
      //а тут не стОит слип , иначе неэффективно
   }
}
« Последнее редактирование: 22-07-2006 17:55 от Алексей1153 » Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines