windows - Er forekomstnavne for systempræstationstællere lokaliseret?

Indlæg af Hanne Mølgaard Plasc

Problem



Performance counter navne i Windows er lokaliseret, så tælleren Processor(\_Total)\% Processor Time kaldes for eksempel noget andet i andre sprogversioner af Windows. Det betyder at for at finde det korrekte navn skal man først finde indekset for tælleren og derefter bruge funktionen PdhLookupPerfNameByIndex for at få det lokaliserede navn (ved hjælp af PdhAddEnglishCounter er ud, hvis Windows XP skal understøttes). [8] [9]


Dette er alt godt for præstationsobjektet (Processor) og tæller (\% Processor Time) dele af tællerbanen ovenfor, men hvad med forekomstnavnet (\_Total)? Jeg kan ikke finde denne streng i registreringsdatabasen, så jeg antager, at den leveres af den systemkomponent, der leverer oplysningerne.


Er instansnavnet for systemleverede ydelsestællere garanteret at være det samme på tværs af forskellige sprogversioner af Windows?


Hvis ikke, hvordan kan jeg afgøre, hvilken forekomst der svarer til \_Total -eksemplet?

Bedste reference


Ifølge denne support KB har kun objekter og tællere venlige navne: [10]



  Dog har forekomster ikke et brugervenligt navn på hvert sprog.



Så det fører mig til at tro, at forekomstnavne for en given tæller opnås enten dynamisk (fx ProcessId til en proces) eller statisk (fx hardkodede). Selvfølgelig er der intet at stoppe nogen fra hardkodning '\_Total' i en engelsk bygning og noget andet i en tysk bygning, selv om det forekommer at almindelig praksis er at holde sprogspørgsmålene begrænset til registret og håndtere objekter og tællere ved indeks og forekomster med dynamiske eller statiske navne. Jeg tror, ​​at Microsoft konsekvent bruger '\_Total' som jeg har set det på et par fremmedsprogsinstallationer.

Andre referencer 1


Luke er korrekt. For at få den lokaliserede version af Processor (\_Total) \\% Processortid, skal vi få de lokaliserede navne på hver af komponenterne i stien 'Processor' og '\% Processortid' med '(\_Total)' konstant . Indekserne kan variere på tværs af OS versioner, så du skal opdage dem på hvert løb. Modulet win32pyutil indeholder metoder, der vil indlæse engelsk-til-indekskortet, men bevarer det, og da det ikke er lille, hvis du kun har brug for det en gang, så kan det være en memory waster. følge:


def \_find\_pdh\_counter\_localized\_name(eng\_names,machine\_name=None):
    '''
    Create a map of english names to indexes. We then lookup the english 
    name in the map to get the localized name.

    Shamefully lifted from win32pdhutil, only this one uses a transient map 
    instead of a persistent one.

    Will throw KeyError if a name is asked for that is not in the list.
    '''
    import win32api, win32con
    counter\_reg\_value = win32api.RegQueryValueEx(
        win32con.HKEY\_PERFORMANCE\_DATA, "Counter 009"
    )
    counter\_list = counter\_reg\_value[0]
    eng\_map={}
    for i in range(0, len(counter\_list) - 1, 2):
        try:
            counter\_id = int(counter\_list[i])
        except ValueError:
            continue
        eng\_map[counter\_list[i+1].lower()] = counter\_id
    ret = [] 

    for name in eng\_names:
        ret.append(win32pdh.LookupPerfNameByIndex(
            machine\_name, eng\_map[name.lower()])
        )
    del eng\_map
    return tuple(ret)


At konstruere tællernavnet:


    names = \_find\_pdh\_counter\_localized\_name(['processor','\% processor time'])
    counter\_name = r'\%s(\_Total)\%s' \% names


som giver den ønskede værdi. fx '\ Processore (\_Total) \\% Tempo Processore' på italiensk.