Про диспетчер задач я в курсе, но что делать если программа завершается раньше чем ты успеешь нажать Ctrl? Я ждал что мне подскажут программу вроде профайлеров, только отображающую расход памяти.
Сообщение отредактировал Kornival - Воскресенье, 04 Сентября 2011, 19:51
Kornival, Код на VB6. В инете взял, работает проверено. Думаю сможешь доработать под свои нужды.
1. Создай модуль и вставь этот код.
Code
Public Declare Function GetProcessMemoryInfo Lib "PSAPI.DLL" (ByVal hProcess As Long, ppsmemCounters As PROCESS_MEMORY_COUNTERS, ByVal cb As Long) As Long Public Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long Public Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As PROCESSENTRY32) As Long Public Declare Function CloseHandle Lib "Kernel32.dll" (ByVal Handle As Long) As Long Public Declare Function OpenProcess Lib "Kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long Public Declare Function EnumProcesses Lib "PSAPI.DLL" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long Public Declare Function GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long Public Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long Public Declare Function GetVersionExA Lib "kernel32" (lpVersionInformation As OSVERSIONINFO) As Integer Public Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long Public Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long Public Declare Sub GlobalMemoryStatus Lib "kernel32" (lpBuffer As MEMORYSTATUS)
Public Const PROCESS_QUERY_INFORMATION = 1024 Public Const PROCESS_VM_READ = 16 Public Const MAX_PATH = 260 Public Const STANDARD_RIGHTS_REQUIRED = &HF0000 Public Const SYNCHRONIZE = &H100000 Public Const PROCESS_ALL_ACCESS = &H1F0FFF Public Const TH32CS_SNAPPROCESS = &H2& Public Const hNull = 0 Public Const WIN95_System_Found = 1 Public Const WINNT_System_Found = 2 Public Const Default_Log_Size = 10000000 Public Const Default_Log_Days = 0 Public Const SPECIFIC_RIGHTS_ALL = &HFFFF Public Const STANDARD_RIGHTS_ALL = &H1F0000
Type MEMORYSTATUS dwLength As Long dwMemoryLoad As Long dwTotalPhys As Long dwAvailPhys As Long dwTotalPageFile As Long dwAvailPageFile As Long dwTotalVirtual As Long dwAvailVirtual As Long End Type
Type PROCESS_MEMORY_COUNTERS cb As Long PageFaultCount As Long PeakWorkingSetSize As Long WorkingSetSize As Long QuotaPeakPagedPoolUsage As Long QuotaPagedPoolUsage As Long QuotaPeakNonPagedPoolUsage As Long QuotaNonPagedPoolUsage As Long PagefileUsage As Long PeakPagefileUsage As Long End Type
Public Type PROCESSENTRY32 dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * 260 End Type
Public Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 End Type
Public Function GetProcesses(ByVal EXEName As String) Dim booResult As Boolean Dim lngLength As Long Dim lngProcessID As Long Dim strProcessName As String Dim lngSnapHwnd As Long Dim udtProcEntry As PROCESSENTRY32 Dim lngCBSize As Long Dim lngCBSizeReturned As Long Dim lngNumElements As Long Dim lngProcessIDs() As Long Dim lngCBSize2 As Long Dim lngModules(1 To 200) As Long Dim lngReturn As Long Dim strModuleName As String Dim lngSize As Long Dim lngHwndProcess As Long Dim lngLoop As Long Dim b As Long Dim c As Long Dim e As Long Dim d As Long Dim pmc As PROCESS_MEMORY_COUNTERS Dim lret As Long Dim strProcName2 As String Dim strProcName As String On Error GoTo Error_handler booResult = False EXEName = UCase$(Trim$(EXEName)) lngLength = Len(EXEName) Select Case getVersion() Case WIN95_System_Found Case WINNT_System_Found lngCBSize = 8 lngCBSizeReturned = 96 Do While lngCBSize <= lngCBSizeReturned DoEvents lngCBSize = lngCBSize * 2 ReDim lngProcessIDs(lngCBSize / 4) As Long lngReturn = EnumProcesses(lngProcessIDs(1), lngCBSize, lngCBSizeReturned) Loop lngNumElements = lngCBSizeReturned / 4 'Loop thru each process For lngLoop = 1 To lngNumElements DoEvents 'Get a handle to the Process and Open lngHwndProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0, lngProcessIDs(lngLoop)) If lngHwndProcess <> 0 Then 'Get an array of the module handles for the specified process lngReturn = EnumProcessModules(lngHwndProcess, lngModules(1), 200, lngCBSize2) 'If the Module Array is retrieved, Get the ModuleFileName If lngReturn <> 0 Then 'Buffer with spaces first to allocate memory for byte array strModuleName = Space(MAX_PATH) 'Must be set prior to calling API lngSize = 500 'Get Process Name lngReturn = GetModuleFileNameExA(lngHwndProcess, lngModules(1), strModuleName, lngSize) 'Remove trailing spaces strProcessName = Left(strModuleName, lngReturn) 'Check for Matching Upper case result strProcessName = UCase$(Trim$(strProcessName)) strProcName2 = GetElement(Trim(Replace(strProcessName, Chr$(0), "")), "\", 0, 0, GetNumElements(Trim(Replace(strProcessName, Chr$(0), "")), "\") - 1) If strProcName2 = EXEName Then 'Get the Site of the Memory Structure pmc.cb = LenB(pmc) lret = GetProcessMemoryInfo(lngHwndProcess, pmc, pmc.cb) MsgBox EXEName & "::" & CStr(pmc.WorkingSetSize / 1024) End If End If End If 'Close the handle to this process lngReturn = CloseHandle(lngHwndProcess) DoEvents Next End Select IsProcessRunning_Exit: 'Exit early to avoid error handler Exit Function Error_handler: Err.Raise Err, Err.Source, "ProcessInfo", Error Resume Next End Function
Private Function getVersion() As Long Dim osinfo As OSVERSIONINFO Dim retvalue As Integer osinfo.dwOSVersionInfoSize = 148 osinfo.szCSDVersion = Space$(128) retvalue = GetVersionExA(osinfo) getVersion = osinfo.dwPlatformId End Function
Private Function StrZToStr(s As String) As String StrZToStr = Left$(s, Len(s) - 1) End Function
Public Function GetElement(ByVal strList As String, ByVal strDelimiter As String, ByVal lngNumColumns As Long, ByVal lngRow As Long, ByVal lngColumn As Long) As String Dim lngCounter As Long ' Append delimiter text to the end of the list as a terminator. strList = strList & strDelimiter ' Calculate the offset for the item required based on the number of columns the list ' 'strList' has i.e. 'lngNumColumns' and from which row the element is to be ' selected i.e. 'lngRow'. lngColumn = IIf(lngRow = 0, lngColumn, (lngRow * lngNumColumns) + lngColumn) ' Search for the 'lngColumn' item from the list 'strList'. For lngCounter = 0 To lngColumn - 1 ' Remove each item from the list. strList = Mid$(strList, InStr(strList, strDelimiter) + Len(strDelimiter), Len(strList)) ' If list becomes empty before 'lngColumn' is found then just ' return an empty string. If Len(strList) = 0 Then GetElement = "" Exit Function End If Next lngCounter ' Return the sought list element. GetElement = Left$(strList, InStr(strList, strDelimiter) - 1) End Function
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 'Function GetNumElements (ByVal strList As String, ' ByVal strDelimiter As String) ' As Integer ' ' strList = The element list. ' strDelimiter = The delimiter by which the elements in ' 'strList' are seperated. ' ' The function returns an integer which is the count of the ' number of elements in 'strList'. ' ' Author: Roger Taylor ' ' Date:26/12/1998 ' ' Additional Information: ' ' Revision History: ' ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function GetNumElements(ByVal strList As String, ByVal strDelimiter As String) As Integer Dim intElementCount As Integer If Len(strList) = 0 Then GetNumElements = 0 Exit Function End If strList = strList & strDelimiter While InStr(strList, strDelimiter) > 0 intElementCount = intElementCount + 1 strList = Mid$(strList, InStr(strList, strDelimiter) + 1, Len(strList)) Wend GetNumElements = intElementCount End Function
2. Размести, кнопку на форме и для события клика, вставь этот код.
Code
GetProcesses "explorer.exe"
Как видно это для "explorer.exe" заменишь на нужный. И по клику будет выдаваться инфа о потребляемой памяти. Допилить под монитор думаю не трудно.
З.Ы. Названия формы, модуля, кнопки. Оставь по умолчанию.
Сообщение отредактировал serg-kkz - Воскресенье, 04 Сентября 2011, 23:11
каким образом можно точно узнать сколько тратит оперативной памяти программа на С++?
Можно использовать специальные утилиты и отладчики, например, valgrind. Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
О Cofein, попробуй собрать с дебаг-конфигурацией и покажи билд-лог. Огромная к тебе просьба-не выкладывай больше скриншотов с ошибками, просто скопируй сюда лог. Never compromise. Not even in the face of Armageddon.
Задание из книги Дейтелов. Нужно найти 2ва наибольших значения из 10ти чисел (каждое число вводить только один раз).
Вот что у меня пока получилось, но это не правильно. Если второе максимальное число стоит после первого, то оно не записывается во второе максимальное. Как сделать по нормальному?
Про диспетчер задач я в курсе, но что делать если программа завершается раньше чем ты успеешь нажать Ctrl? Я ждал что мне подскажут программу вроде профайлеров, только отображающую расход памяти.
Если честно, глупый вопрос. Ответ на него должен знать любой программист. Можно ставить breakpoint (точка останова) в отладчике (среде программирования) - тогда не нужно изменять код. Отладчик приостанавливает выполнение на отмеченной точке, но программа "весит" в оперативной памяти, т.е. тем же диспетчером можно увидеть, сколько она занимает памяти в конкретной точке выполнения. Как вариант, если в отладчике нету breakpoint'ов (или самого отладчика нету, только компилятор), поставь в коде программы, перед тем, как начнётся освобождение памяти (или перед завершением, если не используются динамические типы данных), команду для приостановки работы программы (ну типа sleep() или wait(), или что там у вас в C++). Но это проверка на глобальные переменные, а если вызываются свои процедуры/функции - то приостановку нужно делать внутри процедуры.
Cofein, если ошибка с командной строкой, то это ошибка с командной строкой. Что-то она не хочет выполнятся. Проверь, там ли она у тебя лежит, или, может, в пуск>>выполнить запускается другой файл, а cmd.exe просто нет (или она в другой папке)?.. Открой проводник и введи "C:\WINDOWS\system32\cmd.exe".
clidi, используй массив из 10 чисел. Сначала вводишь данные с клавиатуры в ячейки массива. Присваиваешь largest1 и largest2 минимально возможное значение (а оно может быть отрицательным; или у тебя только натуральные числа?). Потом первый пробег по массиву - проверяем, если значение ячейки больше largest1, записываем её значение в эту переменную. Т.о. получаем первое максимальное. Затем второй пробег по массиву - если значение ячейки больше largest2, но меньше largest1 (как я понимаю, второй максимум - меньше первого?) - записываем её значение в largest2. Выводим полученные числа. Конечно, алгоритм немного громоздкий и относительно медленный, но зато точно работающий.
Сообщение отредактировал TimKruz - Среда, 21 Сентября 2011, 15:55
Возьми любой учебник для начинающих, освой его, вот и будут основы (управление вводом-выводом, циклы, массивы, ссылки, указатели, ООП и др.) Список тем там примерно один и тот же освещается. Из учебников можешь почитать: Р. Лафоре "Объектно-ориентированное программирование в с++", Герберт Шилдт "с++ Базовый курс", Джесс Либерти "с++ за 21 день". У каждого из них свои плюсы и недостатки, но в целом это одни из лучших учебников для начинающих.
Сообщение отредактировал Рестор - Понедельник, 10 Октября 2011, 08:11
Увидел в учебнике функции и переменные, объявленные типом перечисления. Почему-то мой компилятор(VS 2010) не хочет такое компилить. В интернете тоже читал про такие объявления. Я что то не так делаю, или из языка убрали?
Code
enum example { a, b, c };
example func(); //ошибка example x; //ошибка
Сообщение отредактировал SWFcreator - Суббота, 22 Октября 2011, 17:58