Go Back   FileForums > Game Backup > PC Games > PC Games - CD/DVD Conversions > Conversion Tutorials

Reply
 
Thread Tools Search this Thread Display Modes
  #1  
Old 18-08-2021, 11:02
DiCaPrIo DiCaPrIo is offline
Registered User
 
Join Date: Apr 2017
Location: Don't Know
Posts: 48
Thanks: 90
Thanked 49 Times in 30 Posts
DiCaPrIo is on a distinguished road
Quote:
Originally Posted by Masquerade View Post
Is there a way to detect the amount of CPU threads / cores there are and do something accordingly?

Eg.

if CPU_THREADS = 6 then
begin
do_stuff
end else begin
do_other_stuff
end;

Asking because some multithreading tools crash when dealing with 6 or 12 threads.
Code:
function GetSysCores(): Integer;
var
  WbemLocator, WbemServices, WbemObjectSet, WbemObject: Variant;
begin;
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WbemServices := WbemLocator.ConnectServer('localhost', 'root\CIMV2');
  WbemObjectSet := WbemServices.ExecQuery('Select NumberOfCores from Win32_Processor');
  WbemObject := WbemObjectSet.ItemIndex(0);
  Result := WbemObject.Properties_.Item('NumberOfCores').Value;
  WbemLocator:=Unassigned;
  WbemServices:=Unassigned;
  WbemObjectSet:=Unassigned;
  WbemObject:=Unassigned;
end;

function GetSysThreads(): Integer;
var
  WbemLocator, WbemServices, WbemObjectSet, WbemObject: Variant;
begin;
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WbemServices := WbemLocator.ConnectServer('localhost', 'root\CIMV2');
  WbemObjectSet := WbemServices.ExecQuery('Select NumberOfLogicalProcessors from Win32_Processor');
  WbemObject := WbemObjectSet.ItemIndex(0);
  Result := WbemObject.Properties_.Item('NumberOfLogicalProcessors').Value;
  WbemLocator:=Unassigned;
  WbemServices:=Unassigned;
  WbemObjectSet:=Unassigned;
  WbemObject:=Unassigned;
end;
Reply With Quote
The Following User Says Thank You to DiCaPrIo For This Useful Post:
Masquerade (18-08-2021)
Sponsored Links
  #2  
Old 18-08-2021, 11:37
Masquerade Masquerade is offline
Registered User
 
Join Date: Jan 2020
Location: Monte d'Or
Posts: 1,217
Thanks: 294
Thanked 1,405 Times in 637 Posts
Masquerade is on a distinguished road
DiCaPrIo
So I would put if GetSysCores = 6 in the if loop after calling the function?
Reply With Quote
  #3  
Old 18-08-2021, 11:56
DiCaPrIo DiCaPrIo is offline
Registered User
 
Join Date: Apr 2017
Location: Don't Know
Posts: 48
Thanks: 90
Thanked 49 Times in 30 Posts
DiCaPrIo is on a distinguished road
Quote:
Originally Posted by Masquerade View Post
DiCaPrIo
So I would put if GetSysCores = 6 in the if loop after calling the function?
Code:
procedure InitializeWizard();
var Cores,Threads:Integer;
begin
  Cores:=GetSysCores;
  Threads:=GetSysThreads;
  if Cores = 6 then begin
  //yourcode
  end;
  if Threads = 6 then begin
  //yourcode
  end;
end;
Reply With Quote
The Following User Says Thank You to DiCaPrIo For This Useful Post:
Masquerade (18-08-2021)
  #4  
Old 18-08-2021, 13:09
Cesar82's Avatar
Cesar82 Cesar82 is offline
Registered User
 
Join Date: May 2011
Location: Brazil
Posts: 1,074
Thanks: 1,814
Thanked 2,304 Times in 787 Posts
Cesar82 is on a distinguished road
Quote:
Originally Posted by Masquerade View Post
DiCaPrIo
So I would put if GetSysCores = 6 in the if loop after calling the function?
As the function returns an integer value I think I can use it directly without declaring variables.
if GetSysCores = 6 then
begin

end;

The function can also be simplified using variables of type variant so you can get any supported value just by changing the string you want to search for.
Code:
function GetSysInfo(const WMIClass, WMIProperty: String): Variant;
var
  WbemLocator, WbemServices, WbemObjectSet, WbemObject: Variant;
begin;
  WbemLocator := CreateOleObject('WbemScripting.SWbemLocator');
  WbemServices := WbemLocator.ConnectServer('localhost', 'root\CIMV2');
  WbemObjectSet := WbemServices.ExecQuery('Select ' + WMIProperty + ' from ' + WMIClass);
  if (not VarIsNull(WbemObjectSet)) and (WbemObjectSet.Count > 0) then begin
    WbemObject := WbemObjectSet.ItemIndex(0);
    if not VarIsNull(WbemObject) then
      Result := WbemObject.Properties_.Item(WMIProperty).Value;
  end;
end;

procedure GetFreeMemory(var Free, Total: Extended);
begin
  Total := GetSysInfo('Win32_OperatingSystem', 'TotalVisibleMemorySize');
  Free := GetSysInfo('Win32_OperatingSystem ', 'FreePhysicalMemory');
end;

function CPUCores: Integer;
begin
  Result := GetSysInfo('Win32_Processor', 'NumberOfCores');
end;

function CPUThreads: Integer;
begin
  Result := GetSysInfo('Win32_Processor', 'NumberOfLogicalProcessors');
end;

You can also use the API if you prefer to get Threads.
Code:
type
  TSystemInfo = record
    wProcessorArchitecture: Word;
    wReserved: Word;
    dwPageSize: DWORD;
    lpMinimumApplicationAddress: Integer;
    lpMaximumApplicationAddress: Integer;
    dwActiveProcessorMask: DWORD;
    dwNumberOfProcessors: DWORD;
    dwProcessorType: DWORD;
    dwAllocationGranularity: DWORD;
    wProcessorLevel: Integer;
    wProcessorRevision: Word;
  end;

procedure GetSystemInfo(var lpSystemInfo: TSystemInfo);
  external '[email protected] stdcall delayload';

function GetCPUThreads: Integer;
var
  SysInfo: TSystemInfo;
begin
  GetSystemInfo(SysInfo);
  Result := SysInfo.dwNumberOfProcessors;
end;
Reply With Quote
The Following 3 Users Say Thank You to Cesar82 For This Useful Post:
DiCaPrIo (18-08-2021), ffmla (01-10-2021), Masquerade (18-08-2021)
Reply

Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
INNO TROUBLESHOOT - Tutorials and Answers about INNO Setup REV0 Conversion Tutorials 129 21-05-2021 05:51
INNO TUTORIAL - Using Unicode and ANSI Versions of INNO Setup REV0 Conversion Tutorials 51 26-03-2015 06:57
Frequently Asked Questions Joe Forster/STA PC Games - Frequently Asked Questions 0 29-11-2005 09:48



All times are GMT -7. The time now is 11:14.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2026, vBulletin Solutions Inc.
FileForums @ https://fileforums.com