purebasic.info

PureBasic forum
Текущее время: Пт янв 19, 2018 4:11 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
 Заголовок сообщения: Добываем информацию о процессоре
СообщениеДобавлено: Пт июн 24, 2011 1:48 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
1.Определение тактовой частоты процессора
в Win 7 выдает какие-то мутные результаты ((
2.Определение модели процессора
3.Определение идентификатора вендора
Всю эту инфу можно вытащить из реестра
HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0
Но мы ведь не ищем легких путей :D
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
; 1.Определение тактовой частоты процессора
;   Частоту своего проца можно посмотреть в ветке реестра
;   HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0
;   в Win 7 выдает какие-то мутные результаты ((
; 2.Определение модели процессора
; 3.Определение идентификатора вендора
 
Enumeration
  #Window_0
EndEnumeration
Enumeration
  #Text_0
  #Text_1
  #Text_3
  #Text_4
  #Text_5
  #Text_6
EndEnumeration
Enumeration
  #Font_Text_0
EndEnumeration
Define.l Event, EventWindow, EventGadget, EventType, EventMenu
 
 #DelayTime = 500    ; время измерения в миллисекундах
 Global hFontCur10 = LoadFont(#Font_Text_0, "Courier New", 10, 16)
 
Procedure GetCpuSpeed_(*x)
 TimerHi.l
 TimerLo.l
 PriorityClass.l
 Priority.l
 Repeat
 PriorityClass = GetPriorityClass_(GetCurrentProcess_())                  
 Priority = GetThreadPriority_(GetCurrentThread_())
 SetPriorityClass_(GetCurrentProcess_(), #REALTIME_PRIORITY_CLASS)          
 SetThreadPriority_(GetCurrentThread_(), #THREAD_PRIORITY_TIME_CRITICAL)
 Sleep_(30)
  EnableASM
    rdtsc              ;Считываем текущее значение TSC.
    mov TimerLo, eax
    mov TimerHi, edx
 Sleep_(#DelayTime)
    rdtsc
    sub eax, TimerLo
    sbb edx, TimerHi
    mov TimerLo, eax
    mov TimerHi, edx
  DisableASM
 SetThreadPriority_(GetCurrentThread_(), Priority)
 SetPriorityClass_(GetCurrentProcess_(), PriorityClass)
    Result.d = TimerLo / (1000.0 * #DelayTime)
    cpuSpeed$ = StrD(Result, 3)
    SetGadgetText(#Text_1, cpuSpeed$ + " " + "MHz")
    Sleep_(300)
 ForEver  
EndProcedure
 
Procedure OpenWindow_Window_0()
  If OpenWindow(#Window_0, 400, 200, 500, 110, "CPU Info", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
    TextGadget(#Text_0, 20, 15, 160, 20, "Частота процессора")
    TextGadget(#Text_1, 180, 15, 150, 20, "")
    SetGadgetFont(#Text_0, hFontCur10)
    SetGadgetFont(#Text_1, hFontCur10)
    SetGadgetColor(#Text_1, #PB_Gadget_FrontColor, $FF0000)
    TextGadget(#Text_3, 20, 45, 160, 20, "Модель процессора")
    TextGadget(#Text_4, 180, 45, 450, 20, "")
    SetGadgetFont(#Text_3, hFontCur10)
    SetGadgetFont(#Text_4, hFontCur10)
    SetGadgetColor(#Text_4, #PB_Gadget_FrontColor, $FF0000)
    TextGadget(#Text_5, 20, 75, 160, 20, "ID вендора")
    TextGadget(#Text_6, 180, 75, 450, 20, "")
    SetGadgetFont(#Text_5, hFontCur10)
    SetGadgetFont(#Text_6, hFontCur10)
    SetGadgetColor(#Text_6, #PB_Gadget_FrontColor, $FF0000)
  EndIf
EndProcedure
 
OpenWindow_Window_0()
CreateThread(@GetCpuSpeed_(), 0)
;Procedure.s BrandCPU()
brand.s{48}
vendor.s{12}
Bit21.l = $200000     ;  EFlag
EnableASM
 pushfd                ; Проверка поддержки CPUID  
 pop eax                
 mov edx,eax
 XOr edx,[v_Bit21]
 push edx                          
 popfd                  
 pushfd
 pop edx
 push eax
 popfd  
 cmp eax,edx
 je nocpuid            ; конец проверки
 ;====================  Определение модели процессора ===============================
 mov eax,80000002h
 !cpuid
 mov dword[v_brand+0],eax
 mov dword[v_brand+4],ebx
 mov dword[v_brand+8],ecx
 mov dword[v_brand+12],edx
 mov eax,80000003h
 !cpuid
 mov dword[v_brand+16],eax
 mov dword[v_brand+20],ebx
 mov dword[v_brand+24],ecx
 mov dword[v_brand+28],edx
 mov eax,80000004h
 !cpuid
 mov dword[v_brand+32],eax
 mov dword[v_brand+36],ebx
 mov dword[v_brand+40],ecx
 mov dword[v_brand+44],edx
 ;====================  Вендор ============ =========================================
 mov eax,0
 !cpuid
 mov dword[v_vendor+0],ebx
 mov dword[v_vendor+4],edx
 mov dword[v_vendor+8],ecx
 jmp okcpuid
!nocpuid:
   MessageRequester("Ахтунг", "Процессор не поддерживает инструкцию CPUID  ", #MB_OK|#MB_ICONINFORMATION)
   SetGadgetText(#Text_4, "Не могу определить")
   SetGadgetText(#Text_6, "Не могу определить")
 jmp exitcpuid
!okcpuid:
DisableASM
;  ProcedureReturn brand
; EndProcedure
   SetGadgetText(#Text_4, Trim(brand))
   SetGadgetText(#Text_6, Trim(vendor))
! exitcpuid:  
 ;===================================================================================
Repeat
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      If EventGadget = #Text_0
      ElseIf EventGadget = #Text_1
      EndIf
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
ForEver
 


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB