Выход из программы, очистка памяти
При компилировании в режиме Дебаг - всё отлично, работает, выходит без проблем, при компилировании в режиме Релиз - выходит с ошибкой windows'совской.
Показал знакомому программисту - сказал память не очищаешь.
Действительно, не очищаю. Выхожу через ExitProcess(0);
Вопрос: как очистить память?
обнулять каждую переменную которую объявил? или как?
ни в одном языке(borland delphi, VB) такого не видел.
Заранее благодарен.
ЗЫ: Вопрос скорей в спец тему.
что за приложение? WinAPI\MFC\etc?
MFC-приложение
Попробуй вместо ExitProcess(0) посылать своему окну WM_CLOSE, например, так AfxGetMainWnd()->PostMessage(WM_CLOSE);. Немного извращенно, но меня не раз спасало!
Вообще странно. При вызове ExitProcess(0); программа полностью завершается даже не пытаясь ничего очистить. Но вот Windows должна венуть в систему все ресурсы, использованные процессом. Сообщение же об ошибке выдает BaseProcessStart в процессе при необработаном исключении.
Скриншот ошибок (см. вложение)
Помог только CTRL+ALT+DEL, не было отклика даже на выбор в панели задач.
помоему можно просто theApp.getMainFrame()->Close()
Цитата: ltorriel
При замене ExitProcess(0); на AfxGetMainWnd()->PostMessage(WM_CLOSE); приложение успешно .. зависло, причем намертво.
Помог только CTRL+ALT+DEL, не было отклика даже на выбор в панели задач.
Помог только CTRL+ALT+DEL, не было отклика даже на выбор в панели задач.
Скорее всего из-за потоков
Кстати, сейчас посмотрю закрываю ли я в потоке СОМ порт..
Вообще лучше всего завершать приложение корректно. Т.е. когда заканчивает свою работу основной поток.
Если жмут кнопочку "Выход" на форме, то в файле добавочного потока(там бесконечный цикл с case'ами, break'ами естественно тоже, но не везде) я его посылаю на кейс закрытия, там:
CloseHandle(hCOM); - закрываю открытый в этом же потоке com-порт
ExitThread(0); - завершаю поток
Затем на нажатии клавиши после этого закрываю хэндл потока
CloseHandle(hThread);
и делаю ExitProcess(0);
Получаю каждый раз в релизе ошибки 2 штуки и "Отправить отчет?" 3 штуки.
Корректно - как?
Хотя без кода перед глазами сказать что-либо довольно сложно. Вполне возможно, что проблема совсем не в ExitProcess(0), а где-то "выше".
А по поводу дать функции завершиться - не понял что имеете ввиду.
У меня поток с бесконечным циклом, он разложен на состояния кейсом(работает, пауза, выход). Когда жму кнопку, передаю через глобальную переменную ему значение для перехода на кейс выхода. Там поток "завершает сам себя" и затем я пытаюсь завершить процесс программы.
Например в VB это делает End, у меня, к сожалению, не получается корректно закрыть приложение.
Всё работает, всем спасибо!
Цитата: ltorriel
Хотелось бы поподробнее - как "просто закрыть" окно с программой?
У вас ведь оконное приложение? Тогда просто пошлите главному окну сообщение WM_CLOSE любым способом.
Цитата: ltorriel
А по поводу дать функции завершиться - не понял что имеете ввиду.
Я имею в виду, что не стоит выходить из потока, используя функцию
ExitThread. Поток завершится, когда вы прервете свой бесконечный цикл и функция потока вернет управление.