Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53

Не корректно завершается приложение

10.08.2013, 19:24. Показов 1341. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, помогите, пожалуйста. Когда пытаюсь закрыть написанную программу, окно закрывается, а в диспетчере задач процесс остаётся, что не так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <windows.h>
 
LRESULT __stdcall WndProc(HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return DefWindowProc(hWnd,message,wParam,lParam);
    }
}
 
int __stdcall WinMain (HINSTANCE hInstance, //Идентификатор программы
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine, int nCmdShow) //nCmdShow - передаётся начальное состояние окна
{
    WNDCLASS wc; //Создание структуры
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = NULL;
    wc.cbWndExtra = NULL;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(6);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = L"class";
    RegisterClass(&wc);
 
    HWND hWnd = CreateWindow(L"class", L"заготовка программы",
                         WS_OVERLAPPEDWINDOW,
                         150, 100, 500, 400,
                         NULL, NULL, hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 
    MSG msg;
    while(true)
    {
        if(PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE))
        {
            if(msg.message == WM_QUIT)
                break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.08.2013, 19:24
Ответы с готовыми решениями:

Как корректно завершить чужое приложение?
Мне надо завершить чужое приложени, чтоб оно типо завершило свои действие сохранило то че надо. Я не имеею хандл это приложение а только...

Программа не завершается корректно
Написал программу, определяющую наибольшее из двух введённых пользователем чисел. Решил усложнить её и завершить её только нажатия,...

Программа не завершается и не совсем корректно работает
Итак, есть следующая программа отправляющая запрос и принимающая ответ. .h file #ifndef HTTPREQUEST_H #define HTTPREQUEST_H ...

13
1779 / 757 / 153
Регистрация: 03.06.2009
Сообщений: 5,940
10.08.2013, 19:34
Неправильный цикл сообщений:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <windows.h>
 
LRESULT __stdcall WndProc(HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam)
{
    switch(message)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    default:
        return DefWindowProc(hWnd,message,wParam,lParam);
    }
}
 
int __stdcall WinMain (HINSTANCE hInstance, //Идентификатор программы
                       HINSTANCE hPrevInstance,
                       LPSTR lpCmdLine, int nCmdShow) //nCmdShow - передаётся начальное состояние окна
{
    WNDCLASS wc; //Создание структуры
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = NULL;
    wc.cbWndExtra = NULL;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)(6);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = L"class";
    RegisterClass(&wc);
 
    HWND hWnd = CreateWindow(L"class", L"заготовка программы",
                         WS_OVERLAPPEDWINDOW,
                         150, 100, 500, 400,
                         NULL, NULL, hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
 
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
    }
    return 0;
}
0
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
11.08.2013, 06:25  [ТС]
Почему в GetMessage(&msg,NULL,0,0) вместо handle во втором параметре стоит NULL? И чем PeekMessage хуже? На msdn написано
Unlike GetMessage, the PeekMessage function does not wait for a message to be posted before returning.
. Убрал ветвление с WM_QUIT из цикла всё равно процесс остаётся в списке.
C++
1
2
3
4
5
6
7
8
9
10
    while(true)
    {
        if(PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE))
        {
            //if(msg.message == WM_QUIT)
                //break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
0
 Аватар для hello_hell
0 / 0 / 0
Регистрация: 11.08.2013
Сообщений: 26
11.08.2013, 06:55
Цитата Сообщение от Explain Посмотреть сообщение
Почему в GetMessage(&msg,NULL,0,0) вместо handle во втором параметре стоит NULL?
Так она возвращает сообщения для всех окон потока.

Цитата Сообщение от Explain Посмотреть сообщение
Убрал ветвление с WM_QUIT из цикла всё равно процесс остаётся в списке.
Запускай вручную.
0
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
11.08.2013, 07:17  [ТС]
Цитата Сообщение от hello_hell Посмотреть сообщение
Запускай вручную.
Не совсем понял что это значит(
0
 Аватар для hello_hell
0 / 0 / 0
Регистрация: 11.08.2013
Сообщений: 26
11.08.2013, 07:21
Так чтобы родителем был explorer.exe. Просто не запускай в среде программирования.
0
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
11.08.2013, 08:13  [ТС]
Цитата Сообщение от hello_hell Посмотреть сообщение
Так чтобы родителем был explorer.exe. Просто не запускай в среде программирования.
Всё же нельзя сделать так чтобы и через среду программирования всё было нормально?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
11.08.2013, 16:14
Такой цикл нужен для того чтобы что-то в нем постоянно выполнялось. Если цикле выполнять ничего не надо используй цикл из 2-го поста.
C++
1
2
3
4
5
6
7
8
9
10
    MSG msg;
    for ( ; ; ) {
        if ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) {
            TranslateMessage( &msg );
            if ( msg.message == WM_QUIT ) break;
            DispatchMessage( &msg );
        } else {
            ...
        }
    }
0
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
12.08.2013, 06:04  [ТС]
Повторюсь:

Цитата Сообщение от Explain Посмотреть сообщение
Всем привет, помогите, пожалуйста. Когда пытаюсь закрыть написанную программу, окно закрывается, а в диспетчере задач процесс остаётся, что не так?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
12.08.2013, 07:09
Тебе уже дали ответ на вопрос "почему оно не завершается." Повторяюсь, тебе нужно заменить цикл на:
C++
1
2
3
4
5
6
    MSG msg;
    while(GetMessage(&msg,NULL,0,0))
    {
       TranslateMessage(&msg);
       DispatchMessage(&msg);
    }
или
C++
1
2
3
4
5
6
7
8
9
10
    MSG msg;
    for ( ; ; ) {
        if ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) {
            TranslateMessage( &msg );
            if ( msg.message == WM_QUIT ) break;
            DispatchMessage( &msg );
        } else {
            ... некие действия ...
        }
    }
0
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
13.08.2013, 06:05  [ТС]
Извините, если сильно туплю, но зачем менять тип цикла на for и добавлять ветвь else?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
13.08.2013, 06:26
Цитата Сообщение от Explain Посмотреть сообщение
Извините, если сильно туплю, но зачем менять тип цикла на for
Можете и while сделать.
Сравните свой цикл
C++
1
2
3
4
5
6
7
8
9
10
    while(true)
    {
        if(PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE))
        {
            if(msg.message == WM_QUIT)
                break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
    }
с тем, который Вам дали:
C++
1
2
3
4
5
6
7
8
9
    for ( ; ; ) { //Можете и while сделать, да хоть через goto
        if ( PeekMessage( &msg, 0, 0, 0, PM_REMOVE ) ) {
            TranslateMessage( &msg );
            if ( msg.message == WM_QUIT ) break;
            DispatchMessage( &msg );
        } else {
            ... некие действия ...
        }
    }
Цитата Сообщение от Explain Посмотреть сообщение
добавлять ветвь else?
Теперь идем в MSDN и смотрим следующее:
PeekMessage function

ля-ля-ля

Return value
Type: BOOL
If a message is available, the return value is nonzero.
If no messages are available, the return value is zero.
1
1 / 1 / 0
Регистрация: 03.11.2012
Сообщений: 53
13.08.2013, 07:01  [ТС]
Разобрался, всё дело в PeekMessage. Но почему если отлавливать NULL и hWnd то получается разный результат? У нас ведь 1 окно и, вроде, результат одинаковым должен быть.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
13.08.2013, 07:08
Цитата Сообщение от Explain Посмотреть сообщение
У нас ведь 1 окно и, вроде, результат одинаковым должен быть.
Читайте что такое очередь сообщений, ну и справки к соответствующим функциям. Лично у меня нет желания пересказывать учебники
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.08.2013, 07:08
Помогаю со студенческими работами здесь

Программа неожиданно корректно завершается в процедуре, без halt
Функция WithList (строка 330) нормально выполняется, однако после ее завершения программа так же завершается. Остальные два пункта...

Не завершается приложение c hibernate 4
Здравствуйте. Решил осваивать hibernate 4. Читаю документацию, выполняю примеры описанные в ней. Так вот, мапинг работает. Запись,...

Почему приложение не завершается?
Ребята, подскажите.. Есть проект. В нём две формы(скажем frmFirst и frmSecond). Одна из другой вызывается кнопкой. При загрузке frmFirst...

Приложение сразу завершается
Здравствуйте! Подскажите, почему приложение отрабатывается и сразу завершается:using System; using System.Collections.Generic; using...

Собранное приложение завершается с ошибкой
Здравствуйте. Подскажите пожалуйста новичку. Взял приложение из учебника, переписал в Visual Studio, собрал, а оно выкидывает. Приложение...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru