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

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

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

« : 12-08-2008 13:44 » 

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

Далее: перед тем, как программировать собственно логику, из-за которой пишется прототип, решила проверить общую структуру, хотя подвоха не предвиделось.
И тут началось: со стартом приложений проблем не возникло (и за то спасибо). Зато при приеме сообщений принимающая сторона умирает с криками "this = 0xcccccccc, hWnd нашего CDialog-a = Не понял"
Причем поймала я это потому, что предусмотрела для контроля за ситуацией TextBox, в котором вся приходяшая-уходяшая инфа должна отображаться.

Почему это происходит - ума не приложу...

Вот само сообщение:
Код:
const CString INFO_FROM_DEVICE =  "INFO_FROM_DEVICE";
const UINT WM_USER_INFO_FROM_DEVICE = ::RegisterWindowMessage(INFO_FROM_DEVICE);

Так выглядит отправляющая сторона:

Код:

// в конструкторе int m_nPackageNumberByDevice = 0;

void CRedundancy_test_MainFrameDlg::OnDevice()
{
CString sMsg (_T("TestMessage")), sMsgWhole;

sMsgWhole.Format ("%s_%d", sMsg, m_nPackageNumberByDevice);
ATOM aMsg = GlobalAddAtom (sMsgWhole);

BOOL bTest = ::PostMessage( HWND_BROADCAST , WM_USER_INFO_FROM_DEVICE, (WPARAM)aMsg, (LPARAM)m_nPackageNumberByDevice );

m_nPackageNumberByDevice++;
}


Вот принимающая сторона:

Код:
class CDIPDlg : public CDialog
{
//...
DECLARE_MESSAGE_MAP()

afx_msg LRESULT OnInfoFromDevice (WPARAM wParam , LPARAM lParam);
}

DIPDlg.cpp:

ON_REGISTERED_MESSAGE ( WM_USER_INFO_FROM_DEVICE , OnInfoFromDevice )
...

LRESULT CDIPDlg::OnInfoFromDevice ( WPARAM wParam , LPARAM lParam )
{
char sWParam[256], sLParam[256];

processInputMsg ( wParam, lParam, sWParam, sLParam );

    return (LRESULT)true;
}

void CDIPDlg::processInputMsg (WPARAM wParam , LPARAM lParam, char* pWParam, char* pLParam)
{
char sInfoFromMsg[256], sWParam[256], sLParam[256];

UINT nRes = GlobalGetAtomName((ATOM)wParam, sWParam, sizeof(sWParam));
GlobalDeleteAtom((ATOM)wParam);

nRes = GlobalGetAtomName((ATOM)lParam, sLParam, sizeof(sLParam));
GlobalDeleteAtom((ATOM)lParam);

sprintf(sInfoFromMsg, "--->>> receive message: WPARAM = %s *** LPARAM = %s", sWParam, sLParam);
showInfosInEditBox ( sInfoFromMsg );

if ( pWParam )
{
pWParam = sWParam;
}

if ( pLParam )
{
pLParam = sLParam;
}
}

void CDIPDlg::showInfosInEditBox( char* pNewInfo )
{
char allInfos[100000];

CEdit* pEdit = (CEdit*)GetDlgItem (IDC_STATE_DIP);
if (pEdit && pEdit->m_hWnd)
{
CString oldInfo;
pEdit->GetWindowText ( oldInfo );

sprintf (allInfos, "%s \r\n %s", oldInfo, pNewInfo);
pEdit->SetWindowText (allInfos);
}
}


Если надо - могу подвесить все проекты.

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

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

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

WWW
« Ответ #1 : 12-08-2008 14:45 » 

У меня вызывает сомнение вот это:
Код:
ON_REGISTERED_MESSAGE ( WM_USER_INFO_FROM_DEVICE , OnInfoFromDevice )
Значение WM_USER_INFO_FROM_DEVICE будет известно только run-time. Не является ли ON_REGISTERED_MESSAGE конструкцией compile-time?

Попробуй обменяться чем-нибудь стандартным и безобидным.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

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

« Ответ #2 : 12-08-2008 14:56 » 

Ром,

это как раз и предназначено для обмена сообщениями между процессами. И обычно работает. Просто если я это использовала, то у меня были обычные приложения с вьюшками и документами, а не диалог-базированные. Хотя в принципе это должно быть неважно - важно наличие окна для приема.
А чем безобидным ты еще обменяешься между 2 процессами? Я с лету и не соображу.
Записан

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

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

WWW
« Ответ #3 : 12-08-2008 15:00 » 

Например, WM_CLOSE Ага Ну, что-то такое - из стандартных сообщений, для которых не нужно доп. регистрить.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Malaja
Команда клуба

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

« Ответ #4 : 12-08-2008 15:50 » 

А, поняла Ага
хм, доходит безболезненно... "Что-то тут не так" (С)
Ща еще раз с дебагером пройду - такое ощущение, что кто-то портит окошечко...
Записан

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

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

« Ответ #5 : 12-08-2008 16:21 » 

после 2 рестартов компа эта болячка пропала (такое впечатление, что комп усиленно  просится на переинсталляцию).
Зато появилась новая фича - одно из приложений пропадает без объяснения причин.
При этом дебагить даже 3 приложения практически невозможно - зависает комп...
Завтра встрою написание лог-файла, иначе черта с два пойму, в чем дело.
Записан

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

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

WWW
« Ответ #6 : 12-08-2008 16:31 » 

Ир, может лучше найти другие коммуникации, чем сообщения? Их же пруд пруди.

Кстати, статейка не поможет в деле логирования?
https://club.shelek.ru/viewart.php?id=297
« Последнее редактирование: 12-08-2008 16:33 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Алексей++
глобальный и пушистый
Глобальный модератор

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


« Ответ #7 : 12-08-2008 16:48 » 

Ирин, а не вирусы у тебя случаем ?
Записан

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

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

« Ответ #8 : 13-08-2008 07:35 » 

Ром,
спасибочки за ссылку! Сейчас посмотрю!

Леш,
не думаю, т.к. это ж не домашний комп. Тут же контроль полный! На компах стоят платные антивиры, контора вроде бы все контролирует. Каждую пятницу работать невозможно - идет плановая проверка всего компа на вшивость.
Хотя 100%-ной уверенности быть не может, это понятно.
Записан

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

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

« Ответ #9 : 13-08-2008 13:55 » 

Нашла причину внезапного исчезновения приложений - это оказалась проблема с памятью... "Уж сколько раз твердили миру"(С)
Забавно, однако, как это выглядело:
Пока работают 2 приложения, все живет и работает. Как только подключается третье - тушите свет, гасите свечи...

В коде стояло:
Код:
char sInfo[256];
sprintf (sInfo, "что-то там");

В результате в сИнфо периодически стоял мусор, причем уже сначала! Хотя теоретически sprintf заполняет память с первого байта, а не с последнего...
Помогло тривиальное
Код:
strcpy (sInfo, "") 
сразу за объявлением переменной.

Но почему sprintf давал сбой, не поняла... Может кто-то знает?
Записан

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

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #10 : 13-08-2008 14:00 » 

а не проще: char sInfo[256] = {0};
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Джон
просто
Администратор

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

« Ответ #11 : 13-08-2008 14:09 » 

ещё лучше

memset(sInfo, 0, 256);

А сбой мог быть в том случае, если strlen("что-то там")>256. А вобще я бы тоже не советовал межпроцессные коммуникации подобным образом делать. Согласен с Ромой. Есть средства понадёжней.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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
Пол: Женский

« Ответ #12 : 14-08-2008 07:55 » 

Джон,

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

Насчет strlen - я сразу подумала, но я точно знаю, что посылаю - там от силы 15 знаков!
И делаю это через GlobalAddAtom - GlobalGetAtomName, т.е. если строка правильно создана, то она будет в этом состоянии сохранена, а затем выдана мне по моему запросу...
Короче, причину я так и не нашла. Ладно, бог с ним.
В очередной раз выяснила, что забытая впопыхах инициализация может очень дорого стоить. ;-(
Записан

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

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

« Ответ #13 : 14-08-2008 09:09 » 

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

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

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

« Ответ #14 : 14-08-2008 09:21 » 

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

Так что запуск многих инстанций одного приложения допустим, но надо проверить данный конкретный случай.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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


« Ответ #15 : 14-08-2008 11:39 » 

ещё может именованная критическая секция или что нибудь подобное. Но если не используется ничего такого - то отпадает )
Записан

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

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

« Ответ #16 : 14-08-2008 13:16 » 

да ничего общего там нет, в том-то и дело. Я специально не стала ничего городить, ибо опять же не это было целью теста.
Ладно, бог с ним.
Записан

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

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

« Ответ #17 : 14-08-2008 13:27 » 

А  regmon filemon на него натравливала? Это самое первое что нужно в подобных ситуациях делать.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"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
Пол: Женский

« Ответ #18 : 15-08-2008 09:36 » new

Спасибо за напоминание!
если будет время, попробую посмотреть.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines