![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| automax |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 30.9.2002 Репутация: нет Всего: нет |
Одна из функций WINAPI в качестве параметра берет функцию обратного вызова.
После этого я хочу чтобы действия которые обрабатывает эта функция выводились на форму. Для этого, я: Объявляю глобальную переменную типа
И в конструкторе, или одном из методов класса CMyDocument инициализирую mydoc=this:
После этого я в функции обратного вызова вызываю, один из методов класса CMyDocument, а в нем вызываю UpdateAllViews(NULL), и получаю ошибку:
Ошибку выдает UpdateAllViews(NULL); Что-то он не может найти вида Помогите разобраться. Или если у кого-то есть другой вариант решения этой проблемы то подскажите, пожалуйста. |
||||||
|
|||||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Обычно в таких целях я использую CMainFrame как посредник (он знает обо всех документах и видах):
и не нужно тогда объявлять никаких глобальных указателей. -------------------- ![]() |
|||
|
||||
| automax |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 30.9.2002 Репутация: нет Всего: нет |
Проверил предложенный способ. Теперь ошибка происходит при вызове функции pFrame->GetActiveDocument(); в теле глобальной функции.
Есть у меня предположение, что все это происходит из-за того, что глобальная функция работает не в первичном потоке приложения, с которым связаны документ и вид. А в потоке, который был создан API функцией, которая и вызывает функцию обратного вызова. Но с этим потоком не связан ни один документ. Из-за этого и происходит ошибка. Может кто поможет решить проблему. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
ИМХО, поток здесь ни при чём, т.к. AfxGetMainWnd() обращается к единственному глобальному объекту "theApp.m_pMainWnd".
А есть уверенность, что на момент вызова документ, фрейм и вид уже реально созданы ? Т.е. "pFrame->m_hWnd != NULL" ? -------------------- ![]() |
|||
|
||||
| automax |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 30.9.2002 Репутация: нет Всего: нет |
Да. Функция запускается гораздо позже.
А вот код:
И ошибка на вызове, GetActiveDocument() |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Ну что тут можно сказать... Могу только посоветовать посидеть в дебаггере и отловить сбойный участок в исходниках MFC, покопавшись в Call Stack. На крайняк, отказаться от Document/View, или юзать ф-цию MFC вместо callback-функции WinAPI.
Баг совершенно непонятный. Если фрейм существует, и документ с видом присоединены, то как написано в WINFRM.CPP,
То есть либо нету ни одного вида, либо фрейму плохо стало и он себя любимого ASSERT_VALID(this)'ом выглючивает... Сорц, сорц и ещё раз сорц ! Пора бы глянуть на то, что у тебя в исходниках -------------------- ![]() |
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Пора бы с самого начала глянуть
|
|||
|
||||
| automax |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 30.9.2002 Репутация: нет Всего: нет |
В Debug дошел до функции
void CWnd::AssertValid() const; А именно до строчки CHandleMap* pMap = afxMapHWND(); ASSERT(pMap != NULL); В этой функции написано: // Note: if either of the above asserts fire and you are // writing a multithreaded application, it is likely that // you have passed a C++ object from one thread to another // and have used that object in a way that was not intended. // (only simple inline wrapper functions should be used) // // In general, CWnd objects should be passed by HWND from // one thread to another. The receiving thread can wrap // the HWND with a CWnd object by using CWnd::FromHandle. // // It is dangerous to pass C++ objects from one thread to // another, unless the objects are designed to be used in // such a manner. Что это точно означает я не понял. Может что подскажите. Кстати исходники с пояснениями готов выслать, скажите кому. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Ты был прав. Та функция работает в другом потоке, а MC честно предупреждают, что нельзя просто так передавать CWnd из одного потока в другой.
-------------------- ![]() |
|||
|
||||
| automax |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 30.9.2002 Репутация: нет Всего: нет |
Поэтому поводу возникает вопрос? Что же делать?
|
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Ответ уже написан в коде в комментариях Сказано: передайте параметр HWND и в другом потоке создайте объект CWND через CWND::FromeHandle |
|||
|
||||
| automax |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 30.9.2002 Репутация: нет Всего: нет |
Делаю, но это не помогает. Дело в том, что все способы давали получить объект CMainFrame, но вот получить с помощью этого объекта CDocument не удается. Может все таки кто-то хочет посмотреть исходники. Там всего строчек 100.
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Конечно, давай посмотрим на исходник. Так легче будет разобраться (или не разобраться
-------------------- ![]() |
|||
|
||||
| automax |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 54 Регистрация: 30.9.2002 Репутация: нет Всего: нет |
mr.Duda, исходники отправил на e-mail, лови.
|
|||
|
||||
| mr.DUDA |
|
||||||||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 25 Всего: 232 |
Значит так. По порядку, что поменял (исходники я тебе уже отослал):
1) функция RasDialCallBackFunc:
2) объект вид:
3) мейнфрейм:
4) метод CDialerDoc::SetConnState
Коряво. Согласен. Но работает ИМХО, надо было всем эти исходники показать, чтобы народ свои предложения предлагал... -------------------- ![]() |
||||||||
|
|||||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |