7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
1

В цикле ожидания windows message Нарушение прав доступа при чтении "0xfeeeff9a"

21.06.2013, 00:54. Показов 1172. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытаюсь разобраться со вторым примером от Microsoft.
Привожу код, который дает сбой:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while( msg.message != WM_QUIT )
            {
 
                if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
                {
                    TranslateMessage( &msg );
                    switch(msg.message)
                    {
                    case WM_KEYDOWN:
                        switch(msg.wParam)
                        {
                        //бла бла бла что делает каждое нажатие клавиши
                        } //Конец switch на буквы
                    } //Конец switch на WM_KEYDOWN
                DispatchMessage(&msg);
                } // Конец if на PeekMessage
                Render();
            } // Конец цикла на ожидание WM_QUIT
Если в коде функция Render просто стоит в цикле без каких-либо условий (функция вызывается каждую итерацию цикла), то при запуске приложения, если сразу закрыть окно, то выскакивает ошибка "Нарушение прав доступа при чтении "0xfeeeff9a". В тоже время, если изменить код так, чтобы функция Render вызывалась ТОЛЬКО если нету никаких message:
C++
1
2
3
4
} // Конец if на PeekMessage
else                
Render();
} // Конец цикла на ожидание WM_QUIT
То ошибка пропадает.
Вот код функции Render:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
VOID Render()
{
    g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 255, 255, 255 ), 1.0f, 0 );
    flag++;
    if( SUCCEEDED( g_pd3dDevice->BeginScene() ) )
    {
        g_pd3dDevice->SetStreamSource( 0, g_pVB, 0, sizeof(CUSTOMVERTEX) );
    g_pd3dDevice->SetFVF( D3DFVF_CUSTOMVERTEX );
        g_pd3dDevice->DrawPrimitive( D3DPT_POINTLIST, 0, 3);
    g_pd3dDevice->EndScene();
    }
    g_pd3dDevice->Present( NULL, NULL, NULL, NULL );
}
Остановка выполнения происходит во время выполнения этой функции: g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 255, 255, 255 ), 1.0f, 0 );
Причем g_pd3dDevice в это время пуст (под него не выделено памяти) потому и возникает такая ошибка.
И собственно вопрос такой:
Почему при постоянном вызове функции Render в цикле, при закрытии окна сразу вылетает ошибка.
А если засунуть Render в условие, когда никаких message не было отправлено, то все в порядке? оО
Логикой и поэтапным продумыванием понять не удалось...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.06.2013, 00:54
Ответы с готовыми решениями:

"Необработанное исключение в "0x00417c85" в "oui2.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000"."
Пишем программу в VS 2010 на С++ DirectX SDK (June 2010). Доходя до одной строчки появляется...

Необработанное исключение в "0x00412b4a" в "kursovik.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000004".
Программа компилируется нормально но потом на строчке MoveToEx(hdc,Mas.a]->x*20,Mas.a]->y*20,0);...

Необработанное исключение в "0x00414558" в "467.exe": 0xC0000005: Нарушение прав доступа при чтении "0xabababbb"
При выполнении этого кода #include <iostream> #include<conio.h> using namespace std; int...

Необработанное исключение в "0x775e15de" в "laba3.exe": 0xC0000005: Нарушение прав доступа при чтении "0xfdfdfdf9".
вылезает ошибка Необработанное исключение в "0x775e15de" в "laba3.exe": 0xC0000005: Нарушение прав...

5
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
21.06.2013, 10:42 2
Не по теме:
Если ты имеешь виду красную точку слева - это точка где остановилась компиляция , бери выше неё , в твоём случае , выше Render();
0
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
21.06.2013, 10:54  [ТС] 3
Цитата Сообщение от BeginerMan Посмотреть сообщение
Не по теме:
Если ты имеешь виду красную точку слева - это точка где остановилась компиляция , бери выше неё , в твоём случае , выше Render();
Нет, я имею ввиду, что остановка происходит именно из-за ошибки. И я показал где эта ошибка и в чем она заключается.
Вопрос был в том, что если запустить проект и сразу нажать выход из окна, то g_p3dDevice теряет свои данные и не считается полноценной переменной.
0
51 / 50 / 14
Регистрация: 17.11.2012
Сообщений: 427
21.06.2013, 10:58 4
Не знаю почему у тебя не работает , но у меня норм всё , в моём коде.
C++
1
2
3
4
5
6
7
8
9
while(msg.message != WM_QUIT)
{
    if(PeekMessage(&msg,NULL,0U,0U,PM_REMOVE))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    Render();
}
Скорей всего , это из-за Switch:
C++
1
2
3
4
5
6
7
8
switch(msg.message)
{
    case WM_KEYDOWN:
    switch(msg.wParam)
    {
         //бла бла бла что делает каждое нажатие клавиши
    } //Конец switch на буквы
} //Конец switch на WM_KEYDOWN
Попробуй убрать его.
Почему-бы не использовать LRESULT CALLBACK WndProc ???
Для справки:
А вообще PeekMessage проверяет , были ли посланы сообщения , как раз всякие WM_KEYDOWN.
Соответственно без else функция Render будет выполняться всегда , не смотря , что есть сообщения.
А если функция под else , то она будет работать только тогда , когда нет сообщений.

Так что лучше делать под else , если больше не хочешь таких конфликтов.
1
7 / 6 / 2
Регистрация: 29.12.2012
Сообщений: 41
21.06.2013, 11:00 5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    while(true)
    {
        if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
        {
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
 
        if(msg.message == WM_QUIT)
            break;
        else
            Render();
    }
Так не поможет?
1
7 / 7 / 2
Регистрация: 19.06.2013
Сообщений: 174
21.06.2013, 22:00  [ТС] 6
Спасибо за ответы!
Сегодня, после перезагрузки этот странный баг пропал...
Хотя, возможно это так же связано с тем, что я в каждом блоке switch после изменений параметров точек треугольников (которые рисует функция Render) еще добавлял функцию ShowWindow. А сейчас я ее убрал.
Странно конечно... возможно сбои в программе, которые были до этого что-то испортили в памяти, либо еще какая-то совсем непонятная чертовщина.
Большое спасибо BeginerMan и Izaron за советы
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.06.2013, 22:00
Помогаю со студенческими работами здесь

Необработанное исключение в "0x778e15de" в "dir-3.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00000000"
#include <windows.h> #include <d3d9.h> LRESULT __stdcall WndProc(HWND hWnd, UINT msg, WPARAM...

Необработанное исключение в "0x76f015de" в "контрольная 1 задача 2.exe": 0xC0000005: Нарушение прав доступа при чтении "0x334e2c64"
доброго времени суток. Необработанное исключение в "0x76f015de" в "контрольная 1 задача 2.exe":...

Ошибка Необработанное исключение в "0x001d18f8" в "lr7v2.exe": 0xC0000005: Нарушение прав доступа при чтении "0xcdcdcde9"
class Hdd { public: char Hdd_name; int total_space; int free_space; int speed; ...

Необработанное исключение в "0x0fc1d484 (msvcr100d.dll)" в "1.exe": 0xC0000005: Нарушение прав доступа при чтении "0x00aee0af"
помогите разобраться в чем ошибка? необходимо, чтобы ввод массива осуществлялся с клавиатуры...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru