Странное поведение VB

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Странное поведение VB

Сообщение visualman » 30.07.2007 (Пн) 15:04

Данный код показывает загрузку процессора в процентах:
Код: Выделить всё


Private Enum PDH_STATUS
    PDH_CSTATUS_VALID_DATA = &H0
    PDH_CSTATUS_NEW_DATA = &H1
    PDH_CSTATUS_NO_MACHINE = &H800007D0
    PDH_CSTATUS_NO_INSTANCE = &H800007D1
    PDH_MORE_DATA = &H800007D2
    PDH_CSTATUS_ITEM_NOT_VALIDATED = &H800007D3
    PDH_RETRY = &H800007D4
    PDH_NO_DATA = &H800007D5
    PDH_CALC_NEGATIVE_DENOMINATOR = &H800007D6
    PDH_CALC_NEGATIVE_TIMEBASE = &H800007D7
    PDH_CALC_NEGATIVE_VALUE = &H800007D8
    PDH_DIALOG_CANCELLED = &H800007D9
    PDH_CSTATUS_NO_OBJECT = &HC0000BB8
    PDH_CSTATUS_NO_COUNTER = &HC0000BB9
    PDH_CSTATUS_INVALID_DATA = &HC0000BBA
    PDH_MEMORY_ALLOCATION_FAILURE = &HC0000BBB
    PDH_INVALID_HANDLE = &HC0000BBC
    PDH_INVALID_ARGUMENT = &HC0000BBD
    PDH_FUNCTION_NOT_FOUND = &HC0000BBE
    PDH_CSTATUS_NO_COUNTERNAME = &HC0000BBF
    PDH_CSTATUS_BAD_COUNTERNAME = &HC0000BC0
    PDH_INVALID_BUFFER = &HC0000BC1
    PDH_INSUFFICIENT_BUFFER = &HC0000BC2
    PDH_CANNOT_CONNECT_MACHINE = &HC0000BC3
    PDH_INVALID_PATH = &HC0000BC4
    PDH_INVALID_INSTANCE = &HC0000BC5
    PDH_INVALID_DATA = &HC0000BC6
    PDH_NO_DIALOG_DATA = &HC0000BC7
    PDH_CANNOT_READ_NAME_STRINGS = &HC0000BC8
End Enum

Private Const ERROR_SUCCESS = 0

Private Declare Function PdhOpenQuery Lib "PDH.DLL" (ByVal Reserved As Long, ByVal dwUserData As Long, ByRef hQuery As Long) As PDH_STATUS
Private Declare Function PdhCloseQuery Lib "PDH.DLL" (ByVal hQuery As Long) As PDH_STATUS
Private Declare Function PdhVbAddCounter Lib "PDH.DLL" (ByVal QueryHandle As Long, ByVal CounterPath As String, ByRef CounterHandle As Long) As PDH_STATUS
Private Declare Function PdhCollectQueryData Lib "PDH.DLL" (ByVal QueryHandle As Long) As PDH_STATUS
Private Declare Function PdhVbGetDoubleCounterValue Lib "PDH.DLL" (ByVal CounterHandle As Long, ByRef CounterStatus As Long) As Double

Dim hCounter As Long
Dim hQuery As Long
Dim Status As PDH_STATUS

Private Function UpdateValues() As Long
    Dim dblCounterValue As Double
    Dim pdhStatus As Long
       
    PdhCollectQueryData (hQuery)
   
    dblCounterValue = PdhVbGetDoubleCounterValue(hCounter, pdhStatus)

    If (pdhStatus = PDH_CSTATUS_VALID_DATA) Or (pdhStatus = PDH_CSTATUS_NEW_DATA) Then
        UpdateValues = Format$(dblCounterValue, "0")
    Else
        UpdateValues = 0
    End If
End Function

Private Sub Command1_Click()
    Me.Caption = UpdateValues
End Sub

Private Sub Form_Load()
    Status = PdhOpenQuery(0, 1, hQuery)
   
    If Status <> ERROR_SUCCESS Then
        MsgBox "Ошибка"
        End
    End If
    Status = PdhVbAddCounter(hQuery, "\Processor(0)\% Processor Time", hCounter)

End Sub

Private Sub Form_Unload(Cancel As Integer)
    PdhCloseQuery (hQuery)
End Sub



Из процедур Form_Load; UpdateValues и Form_Unload мне нужно сделать одну функцию UpdateValues, соответственно код из Form_Load я вношу в начало функции UpdateValues, а код из Form_Unload в её конец. Получается следующее:

Код: Выделить всё

Private Function UpdateValues() As Long

    Status = PdhOpenQuery(0, 1, hQuery)
   
    If Status <> ERROR_SUCCESS Then
        MsgBox "Ошибка"
        End
    End If
    Status = PdhVbAddCounter(hQuery, "\Processor(0)\% Processor Time", hCounter)

    Dim dblCounterValue As Double
    Dim pdhStatus As Long
       
    PdhCollectQueryData (hQuery)
   
    dblCounterValue = PdhVbGetDoubleCounterValue(hCounter, pdhStatus)

    If (pdhStatus = PDH_CSTATUS_VALID_DATA) Or (pdhStatus = PDH_CSTATUS_NEW_DATA) Then
        UpdateValues = Format$(dblCounterValue, "0")
    Else
        UpdateValues = 0
    End If
   
    PdhCloseQuery (hQuery)
End Function



И вот парадокс: в таком варианте всегда возвращается нулевая загрузка процессора. Объясните, почему так?
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 30.07.2007 (Пн) 15:18

Немножко лень разбираться с кодом, посему может устроит другой вариант:

Код: Выделить всё
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_PerfFormattedData_PerfOS_Processor",,48)
For Each objItem in colItems
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "Win32_PerfFormattedData_PerfOS_Processor instance"
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "PercentIdleTime: " & objItem.PercentIdleTime
Next
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 31.07.2007 (Вт) 11:48

Спасибо, Андрей, но я пишу DLL автоматизации тестирования и предложеный Вами подход, увы не уместен в моём случае ))

Люди!!! Ни кто так и не объяснил, почему в таком варианте не работает!!
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 31.07.2007 (Вт) 12:01

У меня, например, первый способ не работает, потому как возвращается PDH_CSTATUS_NO_OBJECT
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 31.07.2007 (Вт) 12:07

Я думаю, это из-за операционки. Хотя я в 2003 сижу и оно работает, но чем Билли не шутит ))
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 31.07.2007 (Вт) 12:11

FreeBSD

Хех :D

WXP Pro SP2
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 04.08.2007 (Сб) 18:02

Обязательно было написать на асме, да? Чтобы выпендриться, да? И причём на поганом макро-асме...
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 05.08.2007 (Вс) 15:01

Ale-Top
Тем, что форум по Visual Basic.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 05.08.2007 (Вс) 18:46

Поставленная местным идиотом Ale-Top аватара стала последним моментом, который отправил его погулять.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 17.04.2008 (Чт) 12:16

Меня очень интересует эта тема. Но мне нужно определить загрузку процессора именно МОЕЙ программой. То есть программа должна отслеживать свой апетит и не перегружать проц. Но данный алгоритм, похоже, выдает ОБЩУЮ загрузку. Как жить дальше?
Спасибо.

visualman
Бывалый
Бывалый
 
Сообщения: 228
Зарегистрирован: 08.02.2002 (Пт) 19:06
Откуда: Russia

Сообщение visualman » 17.04.2008 (Чт) 14:43

Jupiter, держи спасательный круг:

http://www.Planet-Source-Code.com/vb/sc ... 9&lngWId=1
Причиной ошибок в коде служит давление со стороны руководства и жесткие временные рамки, им установленные.

Jupiter
Обычный пользователь
Обычный пользователь
 
Сообщения: 51
Зарегистрирован: 17.01.2006 (Вт) 12:34

Сообщение Jupiter » 17.04.2008 (Чт) 16:38

visualman писал(а):Jupiter, держи спасательный круг:

http://www.Planet-Source-Code.com/vb/sc ... 9&lngWId=1
Спасибо! ЭТо действительно очень ценный проект!

IvanTheTerrible
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 94
Зарегистрирован: 20.07.2005 (Ср) 11:47
Откуда: Moscow

Re: Странное поведение VB

Сообщение IvanTheTerrible » 19.04.2008 (Сб) 6:25

visualman писал(а):Данный код показывает загрузку процессора в процентах:
...
И вот парадокс: в таком варианте всегда возвращается нулевая загрузка процессора...


Еще один парадокс состоит в том, что при первом вызове всегда возвращается значение 100%. Начиная со 2-го, возвращаемое похоже на правду.
Пользование такими библиотеками напоминает шаманские танцы с бубном :)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 40

    TopList