AUGE_OHR wrote: ↑Thu Aug 29, 2019 1:30 am
hi,
i have modify SMP Sample to run under harbour / HMG
...
about SMPRUN
it will assign a CPU Core to App while running using a BitMask (2^n)
Code: Select all
Core 0 1
Core 1 2
Core 2 4
Core 3 8
---
but i can not change CPU
Hi Jimmy,
Thanks for your sample code
I was succeed with changing of a CPU core on my PC (after many wrong times).
Please take a look for the updated
working sample below:
Code: Select all
#include "dll.ch"
#include "inkey.ch"
#include "common.ch"
#define MB_OK 0x00000000
#define MB_ICONEXCLAMATION 0x00000030
/*
* Einfache Test-Schleife zum Abfragen/Setzen der CPU
* 0 - Beendet Beispiel
* 1 = Nur Erste CPU, 2 = 2. CPU, 4 = 3. CPU, 16 = 8. CPU
*/
PROCEDURE Main
LOCAL nCpu := 1 , nMax := 0
LOCAL aCPU := {1,2,4,8,16,32,64,128,256,512}
LOCAL ProcMask := 0
LOCAL SysMask := 0
#IFDEF __XPP__
Thread():new():start("stress")
#ELSE
REQUEST HB_GT_WIN_DEFAULT
Hb_ThreadStart({|| Stress() } )
#ENDIF
CLS
nMax := CHECKCPU()
? "CPU have "+ STR(nMax) + " Core"
DO WHILE .T.
nCpu := SmpGetCPU(@ProcMask,@SysMask)
IF EMPTY(nCpu)
nCpu := 1
ENDIF
? "Apps run under CPU(s): " + STR(nCpu)
INPUT "New CPU-Mask: (0 => End)" TO nCpu
IF nCpu = 0
EXIT
ENDIF
IF ASCAN(aCPU, {|e| e = nCpu }) > 0
IF SmpSetCPU(nCpu) = 0
? "Error CPU-Mask :" + STR(nCpu)
ENDIF
ENDIF
ENDDO
RETURN
FUNCTION SmpGetCPU(ProcMask,SysMask)
LOCAL i
*#IFDEF __XPP__
* i := DllCall("Xpprt1.dll",DLL_CDECL, "_sysGetCPU")
*#ELSE
GetProcessAffinityMask(@ProcMask,@SysMask)
i := Mask2CPU(ProcMask)
*#ENDIF
RETURN --i
FUNCTION SmpSetCPU(nCpuMask)
LOCAL rc
*#IFDEF __XPP__
* rc := DllCall("Xpprt1.dll",DLL_CDECL, "_sysSetCPU", nCpuMask)
*#ELSE
rc := SetProcessAffinityMask(nCpuMask)
*#ENDIF
RETURN rc
PROCEDURE Stress()
LOCAL a:= {3,2,1,0}
DO WHILE .T.
ASort(a)
ENDDO
RETURN
* ------------------------------------------------------------------------ *
//
// Syntax need libs=hbxpp
//
FUNCTION GetCurrentProcess()
LOCAL rc := 0
rc := dllcall( "Kernel32.dll", DLL_OSAPI, "GetCurrentProcess" )
RETURN rc
FUNCTION GetProcessAffinityMask(ProcMask,SysMask)
LOCAL rc := 0
LOCAL ip := 0
LOCAL bOldError
bOldError := ERRORBLOCK( { | e | BREAK( e ) } )
BEGIN SEQUENCE
ip := GetCurrentProcess()
rc := dllcall( "Kernel32.dll", DLL_OSAPI, "GetProcessAffinityMask",ip,@ProcMask,@SysMask)
END SEQUENCE
ERRORBLOCK( bOldError )
IF EMPTY(rc)
DllCall( "user32.dll", DLL_OSAPI, "MessageBoxA", 0, "Error GetProcessAffinityMask"+STR(ProcMask)+STR(GetLastError()), "Invalid parameter", hb_bitOr( MB_OK, MB_ICONEXCLAMATION ) )
rc := 0
ENDIF
RETURN rc
FUNCTION SetProcessAffinityMask(nProc)
LOCAL rc := 0
LOCAL ip := 0
LOCAL bOldError
bOldError := ERRORBLOCK( { | e | BREAK( e ) } )
BEGIN SEQUENCE
ip := GetCurrentProcess()
rc := dllcall( "Kernel32.dll", DLL_OSAPI, "SetProcessAffinityMask",ip,nProc)
END SEQUENCE
ERRORBLOCK( bOldError )
IF EMPTY(rc)
DllCall( "user32.dll", DLL_OSAPI, "MessageBoxA", 0, "Error SetProcessAffinityMask"+STR(nProc)+STR(GetLastError()), "Invalid parameter", hb_bitOr( MB_OK, MB_ICONEXCLAMATION ) )
rc := 0
ENDIF
RETURN rc
* ------------------------------------------------------------------------ *
*#IFDEF __XPP__
FUNCTION GetLastError()
LOCAL rc := 0
rc := dllcall( "Kernel32.dll", DLL_OSAPI, "GetLastError")
RETURN rc
*#ENDIF
FUNCTION switchcpu( nMax )
LOCAL nWorkCPU
LOCAL nStep
DEFAULT nMax TO 1
#IFDEF __XPP__
IF nMax > 1
nStep := RandomInt( 2, nMax )
ELSE
nStep := RandomInt( 1, nMax )
ENDIF
#ELSE
IF nMax > 1
nStep := Int(Random( 2, nMax ))
ELSE
nStep := Int(Random( 1, nMax ))
ENDIF
#ENDIF
IF nStep = 1
SmpSetCPU( 1 )
ELSE
nWorkCPU := 2 ^ INT( nStep - 1 )
IF SmpSetCPU( nWorkCPU ) = 0
SmpSetCPU( 1 )
ENDIF
ENDIF
nWorkCPU := SmpGetCPU()
RETURN nStep
FUNCTION CHECKCPU()
LOCAL nStep
LOCAL nMaxCPU
nStep := 1
DO WHILE .T.
nMaxCPU := 2 ^ nStep
// IF SmpSetCPU( nMaxCPU ) = 0
EXIT
// ENDIF
nStep ++
ENDDO
nStep := Mask2CPU(nStep)
RETURN nStep
FUNCTION Mask2CPU(nMask)
LOCAL nCPU := 1
LOCAL nRest := nMask
DO WHILE nRest >= 1
nRest := nRest / 2
nCPU++
ENDDO
RETURN nCPU
*
*
*
Please note that I should set the multithread switch in my link script for correct work of above application.
Hope that helps