2011-07-03 3 views
0

J'essaie de lire des informations de GPU-Z mémoire partagée, mais je fais quelque chose de mal. J'ai réussi à traduire la structure de mémoire partagée affichée sur les forums TechPowerUp. Je peux lire tous les GPUZ_RECORD mais pas le GPUZ_SENSOR_RECORD. Toute aide sera appréciée. Je vous remercie!lecture mémoire partagée GPU-Z

EDIT PLUS TARD I:

si j'utilise packet record à la place i don `t obtenir plus AV, mais je ne peux toujours pas obtenir les informations des capteurs.

LATER EDIT II:

Si i est lu pour la data de 0 à 128 (129 éléments), l'élément 128 est le premier capteur et i peut voir les données correctement. :(

const 
    MAX_RECORDS = 128; 

GPUZ_RECORD = record 
    key: array[0..255] of WChar; 
    value: array[0..255] of WChar; 
end; 

GPUZ_SENSOR_RECORD = record 
    name: array[0..255] of WChar; 
    units: array[0..7] of WChar; 
    digits: Cardinal; 
    value: double; 
end; 

GPUZ_SH_MEM = record 
    version : Cardinal; 
    busy: Boolean; 
    lastUpdate: Cardinal; 
    data: array [0..MAX_RECORDS] of GPUZ_RECORD; 
    sensors: array [0..MAX_RECORDS] of GPUZ_SENSOR_RECORD; 
end; 

PGPUZ_SH_MEM = ^GPUZ_SH_MEM; 

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~

procedure TMainForm.readSensors; 
var 
    hMapFile: Thandle; 
    sKey, sVal: string; 
    GPUInfo: PGPUZ_SH_MEM; 
    s, d: integer; 
begin 
    hMapFile := OpenFileMapping(FILE_MAP_READ, FALSE, 'GPUZShMem'); 
    if hMapFile <> 0 then begin 
    log(['Mapping succesfully']);; 
    GPUInfo := MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 0); 
// ShowMessage(IntToStr(GetLastError)); 
    if GPUInfo <> nil then begin 

     log([ GPUInfo^.version ]); 
     log([ GPUInfo^.busy ]); 
     log([ GPUInfo^.lastUpdate ]); 

     log(['LOGING DATA ~~~~~~~~~~~~~~~~~~~~~~']); 
     for d:= 0 to Pred(MAX_RECORDS) do begin 

     sKey := GPUInfo^.data[d].key; 
     sVal := GPUInfo^.data[d].value;  
     if sKey <> '' then log([d, '#: ', sKey, sVal ]); 

     end; 
     log(['LOGING SENSORS ~~~~~~~~~~~~~~~~~~~~']); 
     for s:= 0 to Pred(MAX_RECORDS) do begin 

     sKey := GPUInfo^.sensors[s].name; // i get an AV here when s:=127 
     log([ 'Sensor ', s, '#: ', sKey ]); 

//   sVal := TPN^.sensors[s].units; 
//   log([ 'Unit: ', sVal ]); 
//   log(['Digits: ', TPN^.sensors[s].digits ]); 
//   log(['Value: ', TPN^.sensors[s].value ]); 
     end; 

    end else log([ 'Could not map that zone!' ]); 

    end else begin 
    log(['Could not find the zone for mapping...']); 
    UnmapViewOfFile(GPUInfo); 
    CloseHandle(hMapFile); 
    end; 
end; 

log() est une petite procédure définie comme ceci:

procedure log(vData: array of Variant); 
+0

Alors GPU-Z est un programme de référence et vous accédez à la mémoire partagée via un fichier mappé en mémoire? Un peu de contexte rendrait votre question un peu moins mystérieuse. Vous vous attendez vraiment à ce que les gens ici comprennent ce dont vous parlez sans explication? Aidez les autres à vous aider. –

+0

Eh bien, je pensais GPU-Z est un programme d'information de carte vidéo très bien connu, semble que mon hypothèse était erronée, je suis désolé. Mon problème est que je ne peux pas lire le droit 'GPUZ_SENSOR_RECORD' pour une raison quelconque. Peut-être que je n'ai pas traduit la disposition de la mémoire partagée correctement. –

Répondre

0

ok, un ami m'a aidé à repérer l'erreur dans mon code, comme je me doutais que ma traduction n'était pas irréprochable, donc je vais porter le code corrigé au cas où quelqu'un serait intéressé.

const 
    MAX_RECORDS = 127; // <-- important [0..127] => 128 elements 

GPUZ_RECORD = packed record // <-- all records must be packed 
    key: array[0..255] of WChar; 
    value: array[0..255] of WChar; 
end; 

GPUZ_SENSOR_RECORD = packed record // <-- all records must be packed 
    name: array[0..255] of WChar; 
    units: array[0..7] of WChar; 
    digits: Cardinal; 
    value: double; 
end; 

GPUZ_SH_MEM = packed record // <-- all records must be packed 
    version : Cardinal; 
    busy: Boolean; 
    lastUpdate: Cardinal; 
    data: array [0..MAX_RECORDS] of GPUZ_RECORD; 
    sensors: array [0..MAX_RECORDS] of GPUZ_SENSOR_RECORD; 
end; 

PGPUZ_SH_MEM = ^GPUZ_SH_MEM; 
0

Il s'agit probablement d'un problème d'alignement de structure ou de traduction pascal API/struct Avez-vous vérifié SizeOf (GPUZ_SENSOR_RECORD) en C et voyez s'il correspond à sizeof (GPUZ_SENSOR_RECORD) dans pascal? Avez-vous essayé de changer l'alignement?

+0

c'était un problème avec ma traduction du code C, merci pour votre contribution. –