Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка "a required resource was" 
:(
    Опции темы
AnikinAleksey
  Дата 6.6.2006, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



 smile SDI приложение, при перерисовке контента в момент обработки онМаузМув вылетает такая ошибка. Что бы это значило и как с этим броться??...
Уже 2 дня сижу над этим, а в чем дело понять не могу   smile 
 
PM MAIL ICQ   Вверх
Dray
Дата 6.6.2006, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Материалист
**


Профиль
Группа: Участник
Сообщений: 652
Регистрация: 7.10.2003
Где: г. Всеволожск

Репутация: 2
Всего: 6



код в студию 


--------------------
忍者

user posted image
PM MAIL   Вверх
AnikinAleksey
Дата 6.6.2006, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Код

void CBaseProjView::OnLButtonDown(UINT nFlags, CPoint point) 
{
//проверяю где нажата кнопка, в соответствии с этим выставляю флаги
}

void CBaseProjView::OnMouseMove(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default    
    CBaseProjDoc* pDoc = GetDocument();
    if(isDown){
            point.x+=Delta.x;
            point.y+=Delta.y;
            CRect rect;
            CRect rectNew;
            switch(type){
            case 1:{
                pDoc->pViewers[index]->SetCoordinats(point);
                }break;
            case 2:{
                pDoc->pACP[index]->SetCoordinats(point);
                }break;
            case 3:{
                pDoc->pGen[index]->SetCoordinats(point);
            }break;
            case 4:{
                pDoc->pDif[index]->SetCoordinats(point);
            }break;
            }
            UpdateContent();
        }
}

void CBaseProjView::OnDraw(CDC* pDC)
{
    CBaseProjDoc* pDoc = GetDocument();    
    if(Update){
        UpdateContent();
        Update=false;
    }
    CRect Rect;
    GetClientRect(&Rect);
    pDC->BitBlt(0,0,Rect.right,Rect.bottom,&MemDC,0,0,SRCCOPY);    
    ASSERT_VALID(pDoc);
}

void CBaseProjView::UpdateContent(){
//Рисую содержимое в виртуальный контекст( передаю указатель на него в сответствующие функции-члены)
    CBaseProjDoc* pDoc = GetDocument();    
    for(int i=0;i<pDoc->dViwCnt;i++)
    {
        pDoc->pViewers[i]->Show(&MemDC);
    }
//и т.д.
    CRect Rect;
    GetClientRect(&Rect);
    InvalidateRect(Rect,FALSE);
}


вроде все ... если есть необходимость поясню все сто нужно.. 
PM MAIL ICQ   Вверх
Earnest
Дата 7.6.2006, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Где именно вылетает ошибка (в какой строке) и какая (точное сообщение)?

Кстати, по коду, есть некоторая несогласованность... 
1) Переменную Update лучше сбрасывать в false в самой ф-и UpdateContent, иначе возможны лишние вызовы UpdateContent. 
2) Для симметрии, проверять лучше там же (но необязательно).
3) Еще, в OnMouseMove лучше не вызывать UpdateContent, а ставить флаг Update=true и вызывать InvalidateRect. И убрать InvalidateRect из UpdateContent (вызов InvalidateRect из OnDraw вызывает содрогание).
4) Если нужно инвалидайтить весь клиент, можно просто вызвать Invalidate(True\False). 


--------------------
...
PM   Вверх
AnikinAleksey
Дата 7.6.2006, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Если бы я мог найти строку с ошибкой, то не обращался бы на форум. При работе с приложением в какой то момент(закономерности я не обнаружил) вываливается Мессадж бокс с таким текстом  "a required resource was". Как я понимаю тут либо что то с памятью, ибо вообще непонятно что. Поэтому и спросил может ктото сталкивался. Т.к. память где занимаю, там и освобождаю, утечки нет... а что может быть еще?? Мне хотябы какую-нибудь ниточку smile 


Цитата(Earnest @  7.6.2006,  07:56 Найти цитируемый пост)
1) Переменную Update лучше сбрасывать в false в самой ф-и UpdateContent, иначе возможны лишние вызовы UpdateContent. 

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

Цитата(Earnest @  7.6.2006,  07:56 Найти цитируемый пост)
3) Еще, в OnMouseMove лучше не вызывать UpdateContent, а ставить флаг Update=true и вызывать InvalidateRect. И убрать InvalidateRect из UpdateContent (вызов InvalidateRect из OnDraw вызывает содрогание).

соответственно в онДрав происходит лишь копирование инфы из виртуального контекста в текущий, инвалидате не вызывается соответственно содрогания не будет

Цитата(Earnest @  7.6.2006,  07:56 Найти цитируемый пост)
4) Если нужно инвалидайтить весь клиент, можно просто вызвать Invalidate(True\False). 

ок, учту smile) 
PM MAIL ICQ   Вверх
Earnest
Дата 7.6.2006, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Когда вывалится MessageBox, переключись в отладчик, прерви выполнение и посмотри, откуда растет.

Мои замечания прямо следуют из приведенного тобою кода:
1) В приведенном коде есть 2 вызова UpdateContent: в OnDraw и в MouseMove. Причем, в одном случае флаг сбрасывается, в другом нет. Это грязь и источник будущих ошибок, нарушающий принцип одного места, чтобы ты там не говорил о своих задумках.

2) Из кода OnDraw следует, что флаг Update имеет смысл "перед прорисовкой нужно обновить нек. внутреннее состояние". Если в обработчике MouseMove вызван UpdateContent, то в следующем вызове OnDraw вроде ничего обновлять не нужно. Тем не менее, флаг никто не сбрасывает.

3) Если "контент" нужно обновлять, из OnDraw вызывается UpdateContent, а там в свою очередь вызывается Invalidate. Это некорректно! Нельзя этого делать в WM_PAINT. А под содроганием я имела ввиду вовсе не мерцание, а содрогание души. От этого точно нужно избавиться. 


--------------------
...
PM   Вверх
AnikinAleksey
Дата 7.6.2006, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Цитата(Earnest @  7.6.2006,  16:21 Найти цитируемый пост)
2) Из кода OnDraw следует, что флаг Update имеет смысл "перед прорисовкой нужно обновить нек. внутреннее состояние". Если в обработчике MouseMove вызван UpdateContent, то в следующем вызове OnDraw вроде ничего обновлять не нужно. Тем не менее, флаг никто не сбрасывает.
 но ведь его ни кто и не устанавливает... Все же спасибо за совет, учту.

если это внесет какуюто ясность, вот текст вкладки debug:
Код

Loaded 'ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
Loaded symbols for 'C:\WINDOWS\system32\MFC42D.DLL'
Loaded symbols for 'C:\WINDOWS\system32\MSVCRTD.DLL'
Loaded 'C:\WINDOWS\system32\gdi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\user32.dll', no matching symbolic information found.
Loaded symbols for 'C:\WINDOWS\system32\MFCO42D.DLL'
Loaded 'C:\WINDOWS\system32\mfc42loc.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\advapi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\rpcrt4.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\uxtheme.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcrt.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\MSCTF.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\comctl32.dll', no matching symbolic information found.
Loaded 'C:\Program Files\Genius NetScroll+ Traveler Mouse\Whoru.dll', no matching symbolic information found.
Loaded 'C:\Program Files\Genius NetScroll+ Traveler Mouse\gnetscrl.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\shell32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\shlwapi.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2180_x-ww_a84f1ff9\comctl32.dll', no matching symbolic information found.
Loaded 'C:\Program Files\Arsenal Company\Socrat Dictionary\ArsMouseHook.dll', no matching symbolic information found.
First-chance exception in baseProj.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception.


последняя строка меня приводит в ужас...

Добавлено @ 17:42 
да, а как посмотреть название процедуры в момент ошибки? если вы об окне context то название функции выглядит примерно так "user32 77d5ea24()"...

P.S. извиняюсь за глупый вопрос, я не так давно занимаюсь программированием, не слишком много знаю smile 
PM MAIL ICQ   Вверх
Earnest
Дата 7.6.2006, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Цитата(AnikinAleksey @  7.6.2006,  18:38 Найти цитируемый пост)
последняя строка меня приводит в ужас...

Лучше радуйся.  smile  Хоть какая-то информация.
Стало быть, у тебя возникает исключение, а message почему-то показывается дурацкий. Это бывает, не страшно. Тебе нужно понять, кто его возбуждает. После запуска программы иди в Debug->Exceptions и строке C++ Exceptions поставь опцию "break into debugger". Потом продолжай возить мышью пока не прервется. По идее, должно показать место возбуждения исключения. Не забудь потом вернуть установки Exceptions на место.

По поводу UpdateContent, я бы сделала так: 
1) оставить только один вызов UpdateContent, в OnDraw
2) выкинуть Invalidate из UpdateContent
3) в MouseMove, при возникновении необходимых условий, поставить флаг Update и вызывать Invalidate.

Добавлено @ 17:57 
Цитата(AnikinAleksey @  7.6.2006,  18:38 Найти цитируемый пост)
да, а как посмотреть название процедуры в момент ошибки? если вы об окне context то название функции выглядит примерно так "user32 77d5ea24()"...

Лучше смотреть в окне стека... Но в момент MessageBox это уже бесполезно: код, который обрабатывает исключение, никак не поможет найти место, где оно возбуждается. Нужно  перехватить момент возбуждения, как написано выше.

Добавлено @ 18:00 
Все-таки у меня сильные подозрения по поводу Invalidate в момент прорисовки...
Попробуй закомментировать UpdateContent в MouseMove и посмотри, будет ли валиться.
Если не будет, сделай как написано выше (UpdateContent только в OnDraw и т.д.).
(Если будет, все равно сделай  smile) 


--------------------
...
PM   Вверх
AnikinAleksey
Дата 7.6.2006, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Цитата(Earnest @  7.6.2006,  17:53 Найти цитируемый пост)
После запуска программы иди в Debug->Exceptions и строке C++ Exceptions поставь опцию "break into debugger".
 не нашел такой опции(Visual C++ 6.0). В строке "Microsoft C++ Exception" выставил "Stop always" вместо "Stop if not handled". в момент исключения работа прервалась, и отладчик выдал окно с текстом "First-chance exception in baseProj.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception." жму ок. Курсор стоит в непонятном месте(ассемблерный код)в окне context текст следующего содержания - "kernel32! 7c81eb33()".
сейчас переделаю функцию UpdateContxt в соответствии с вашим советом, может быть это поможет... smile

Добавлено @ 18:18 
не помогло smile 
PM MAIL ICQ   Вверх
Earnest
Дата 7.6.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Context это cтек? Посмотри вниз до первого вразумительного входа...
Поток у тебя один? Надеюсь, это debug-версия?

Если ничего не получится, давай проект.  


--------------------
...
PM   Вверх
AnikinAleksey
Дата 7.6.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



Вылетает в конструкторе карандаша... при попытке создания
Код

CPen::CPen(int nPenStyle, int nWidth, COLORREF crColor)
{
    if (!Attach(::CreatePen(nPenStyle, nWidth, crColor)))
        AfxThrowResourceException(); //Тут
}


при вызове функции рисования элемента

Код

    void Show(CDC* pDC)
    {
        Generator::Show(pDC);
        CPen* pen=new CPen(PS_SOLID,1,RGB(0,0,0)), //в этой строке
            * old=pDC->SelectObject(pen);
        POINT pnt[4];
        pnt[0].x=m_dx+8;
        pnt[0].y=pnt[1].y=m_dy+m_dW/2+7;
        pnt[2].x=pnt[1].x=m_dx+m_dH/2;
        pnt[2].y=pnt[3].y=m_dy+10;
        pnt[3].x=m_dx+m_dH-8;
        pDC->Polyline(pnt,4);
        pDC->SelectObject(old);
    }


поток один, версия дебаг.

Добавлено @ 18:53 
куда продж то кинуть?
я не ленивый, но просто не могу даже представить куда копать smile  
PM MAIL ICQ   Вверх
Earnest
Дата 7.6.2006, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 87
Всего: 183



Заархивируй и прямо сюда клади (нажми ответить, там будет место для файла).

Посмотри с какими параметрами создается перо.
НО похоже ты просто не освобождаешь использованные перья, и они кончились... smile 
delete pen кто будет делать?
А вообще, нафиг тебе там динамический объект?
Можно ведь так:
Код

 CPen pen(PS_SOLID,1,RGB(0,0,0)),
          *pOldPen = pDC->SelectObject(&pen);
 

И далее по тексту... тогда объекты само-уничтожаться...

Добавлено @ 19:10 
Или даже сделай перо членом класса и создай заранее, один раз. А потом только выбирай в контекст.   


--------------------
...
PM   Вверх
AnikinAleksey
Дата 7.6.2006, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 6.6.2006

Репутация: нет
Всего: нет



 smile  smile  smile 
точно  smile ...
спасибо за помощь. 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема »


 




[ Время генерации скрипта: 0.0544 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.