Skip to content

Commit d7db320

Browse files
SND\joelleach_cpSND\joelleach_cp
authored andcommitted
ParallelFox: Added HyperThreading detection.
Fixed Issue 30460: Main process can lose foreground focus. git-svn-id: https://vfpx.svn.codeplex.com/svn/ParallelFox@87005 81e6e737-5a20-4d0f-a97c-cb01297b46e0
1 parent f1b5e8e commit d7db320

3 files changed

Lines changed: 52 additions & 5 deletions

File tree

parallelfox.VCT

2.99 KB
Binary file not shown.

parallelfox.vca

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ VERSION = 3.00[END RESERVED1]
1515
[BASECLASS] custom
1616
[OBJNAME] amanager
1717
[START PROPERTIES]
18-
1918
Name = "amanager"
20-
_memberdata =  271<VFPData><memberdata name="createparameterobject" display="CreateParameterObject"/><memberdata name="createparameterclause" display="CreateParameterClause"/><memberdata name="aarraycopy" display="aArrayCopy"/><memberdata name="copyarray" display="CopyArray"/></VFPData>
19+
_memberdata =  403<VFPData><memberdata name="createparameterobject" display="CreateParameterObject"/><memberdata name="createparameterclause" display="CreateParameterClause"/><memberdata name="aarraycopy" display="aArrayCopy"/><memberdata name="copyarray" display="CopyArray"/><memberdata name="detecthyperthreading" display="DetectHyperThreading"/><memberdata name="lhyperthreading" display="lHyperThreading"/></VFPData>
20+
lhyperthreading = .NULL.
2121
[END PROPERTIES]
2222
[START METHODS]
2323
PROCEDURE copyarray
@@ -98,6 +98,28 @@ EndFor
9898

9999
Return loParameters
100100
ENDPROC
101+
PROCEDURE detecthyperthreading
102+
* Use WMI to determine if HyperThreading is turned on
103+
* This only works on Windows XP SP3, Windows Server 2003, and later because
104+
* underlying Windows APIs were not added until those versions.
105+
Local lcWMIFolder, loWMI, lcolProcessors, loProcessor
106+
107+
This.lHyperThreading = .F.
108+
109+
lcWMIFolder = Addbs(GetEnv("SystemRoot")) + "System32\WBEM\"
110+
If Directory(lcWMIFolder) && make sure installed
111+
loWMI = GetObject("winmgmts:\\.\root\cimv2")
112+
lcolProcessors = loWMI.ExecQuery("Select * from Win32_Processor")
113+
For each loProcessor in lcolProcessors FoxObject
114+
If Type("loProcessor.NumberOfCores")<> "U" and Type("loProcessor.NumberOfLogicalProcessors")<> "U"
115+
* If logical processors > actual cores, HT must be turned on
116+
If loProcessor.NumberOfLogicalProcessors > loProcessor.NumberOfCores
117+
This.lHyperThreading = .T.
118+
EndIf
119+
EndIf
120+
EndFor
121+
EndIf
122+
ENDPROC
101123
[END METHODS]
102124
[START RESERVED1]
103125
Class[END RESERVED1]
@@ -107,8 +129,10 @@ Class[END RESERVED1]
107129
*copyarray Copy array.
108130
*createparameterclause Create parameter clause from parameter object.
109131
*createparameterobject
132+
*detecthyperthreading Detect if HyperThreading is turned on.
110133
^aarraycopy[1,0]
111134
_memberdata XML Metadata for customizable properties
135+
lhyperthreading Is .T. when HyperThreading is turned on.
112136
[END RESERVED3]
113137
[START RESERVED6]
114138
Pixels[END RESERVED6]
@@ -302,10 +326,9 @@ Pixels[END RESERVED6]
302326
[BASECLASS] custom
303327
[OBJNAME] parallel
304328
[START PROPERTIES]
305-
306329
Name = "parallel"
307330
_events = NULL
308-
_memberdata =  755<VFPData><memberdata name="do" display="Do"/><memberdata name="startworkers" display="StartWorkers"/><memberdata name="cpucount" display="CPUCount"/><memberdata name="setworkercount" display="SetWorkerCount"/><memberdata name="docmd" display="DoCmd"/><memberdata name="execscript" display="ExecScript"/><memberdata name="call" display="Call"/><memberdata name="bindevent" display="BindEvent"/><memberdata name="wait" display="Wait"/><memberdata name="_events" display="_Events"/><memberdata name="callmethod" display="CallMethod"/><memberdata name="stopworkers" display="StopWorkers"/><memberdata name="onerror" display="OnError"/><memberdata name="clearqueue" display="ClearQueue"/><memberdata name="setworkerclass" display="SetWorkerClass"/></VFPData>
331+
_memberdata =  825<VFPData><memberdata name="do" display="Do"/><memberdata name="startworkers" display="StartWorkers"/><memberdata name="cpucount" display="CPUCount"/><memberdata name="setworkercount" display="SetWorkerCount"/><memberdata name="docmd" display="DoCmd"/><memberdata name="execscript" display="ExecScript"/><memberdata name="call" display="Call"/><memberdata name="bindevent" display="BindEvent"/><memberdata name="wait" display="Wait"/><memberdata name="_events" display="_Events"/><memberdata name="callmethod" display="CallMethod"/><memberdata name="stopworkers" display="StopWorkers"/><memberdata name="onerror" display="OnError"/><memberdata name="clearqueue" display="ClearQueue"/><memberdata name="setworkerclass" display="SetWorkerClass"/><memberdata name="detecthyperthreading" display="DetectHyperThreading"/></VFPData>
309332
cpucount = 0
310333
[END PROPERTIES]
311334
[START METHODS]
@@ -402,6 +425,15 @@ Debugout Time(0), Program()
402425

403426
_Screen.ParPoolMgr.ClearQueue()
404427
ENDPROC
428+
PROCEDURE detecthyperthreading
429+
* Returns .T. when HyperThreading is Enabled.
430+
* Default value is NULL. Detection is a little slow, so only run once.
431+
If IsNull(_Screen.ParPoolMgr.lHyperThreading)
432+
_Screen.ParPoolMgr.DetectHyperThreading()
433+
EndIf
434+
435+
Return _Screen.ParPoolMgr.lHyperThreading
436+
ENDPROC
405437
PROCEDURE do
406438
* Execute program on worker
407439
Lparameters cPRG, cInProgram, lAllWorkers, tPar1, tPar2, tPar3, tPar4, tPar5, tPar6, ;
@@ -544,6 +576,7 @@ Class[END RESERVED1]
544576
*call Execute/call function on worker.
545577
*callmethod Execute/call class method on worker.
546578
*clearqueue Remove all pending commands from queue.
579+
*detecthyperthreading Returns .T. when HyperThreading is enabled.
547580
*do Execute program on worker.
548581
*docmd Execute single command on worker.
549582
*execscript Execute script on worker.
@@ -629,8 +662,9 @@ Pixels[END RESERVED6]
629662
[BASECLASS] custom
630663
[OBJNAME] parpoolmgr
631664
[START PROPERTIES]
665+
632666
Name = "parpoolmgr"
633-
_memberdata =  1005<VFPData><memberdata name="ncpucount" display="nCPUCount"/><memberdata name="nworkercount" display="nWorkerCount"/><memberdata name="startworkers" display="StartWorkers"/><memberdata name="workers" display="Workers"/><memberdata name="nbusyworkers" display="nBusyWorkers"/><memberdata name="queuecommand" display="QueueCommand"/><memberdata name="processqueue" display="ProcessQueue"/><memberdata name="commandqueue" display="CommandQueue"/><memberdata name="ldebugmode" display="lDebugMode"/><memberdata name="stopworkers" display="StopWorkers"/><memberdata name="handleerror" display="HandleError"/><memberdata name="conerror" display="cOnError"/><memberdata name="clearqueue" display="ClearQueue"/><memberdata name="cworkercomprogid" display="cWorkerCOMProgID"/><memberdata name="cworkerclass" display="cWorkerClass"/><memberdata name="cworkerlibrary" display="cWorkerLibrary"/><memberdata name="nprocessing" display="nProcessing"/><memberdata name="setworkercount" display="SetWorkerCount"/></VFPData>
667+
_memberdata =  1007<VFPData><memberdata name="ncpucount" display="nCPUCount"/><memberdata name="nworkercount" display="nWorkerCount"/><memberdata name="startworkers" display="StartWorkers"/><memberdata name="workers" display="Workers"/><memberdata name="nbusyworkers" display="nBusyWorkers"/><memberdata name="queuecommand" display="QueueCommand"/><memberdata name="processqueue" display="ProcessQueue"/><memberdata name="commandqueue" display="CommandQueue"/><memberdata name="ldebugmode" display="lDebugMode"/><memberdata name="stopworkers" display="StopWorkers"/><memberdata name="handleerror" display="HandleError"/><memberdata name="conerror" display="cOnError"/><memberdata name="clearqueue" display="ClearQueue"/><memberdata name="cworkercomprogid" display="cWorkerCOMProgID"/><memberdata name="cworkerclass" display="cWorkerClass"/><memberdata name="cworkerlibrary" display="cWorkerLibrary"/><memberdata name="nprocessing" display="nProcessing"/><memberdata name="setworkercount" display="SetWorkerCount"/></VFPData>
634668
commandqueue =
635669
conerror =
636670
cworkerclass = WorkerMgr
@@ -1233,9 +1267,15 @@ ENDPROC
12331267
PROCEDURE Init
12341268
* Create worker process
12351269
Lparameters lcProcedureFile, lcDirectory, llDebugMode
1270+
Local lhWndForeground
12361271

12371272
Debugout Time(0), Program(), lcProcedureFile, lcDirectory, llDebugMode
12381273

1274+
* In Windows XP and earlier, main process can lose focus when
1275+
* instantiating COM EXE. Make sure we keep it.
1276+
DECLARE INTEGER GetForegroundWindow IN user32
1277+
lhWndForeground = GetForegroundWindow()
1278+
12391279
* Debug mode starts workers in full VFP.
12401280
If llDebugMode and _VFP.StartMode = 0
12411281
Local loVFP as VisualFoxPro.Application, lcWorkerVCX
@@ -1249,6 +1289,13 @@ Else
12491289
This.oWorker = CreateObject(_Screen.ParPoolMgr.cWorkerCOMProgID)
12501290
EndIf
12511291

1292+
* In Windows XP and earlier, main process can lose focus when
1293+
* instantiating COM EXE. Make sure we keep it.
1294+
If GetForegroundWindow() <> lhWndForeground
1295+
DECLARE INTEGER SetForegroundWindow IN user32 INTEGER hwnd
1296+
SetForegroundWindow(lhWndForeground)
1297+
EndIf
1298+
12521299
This.oWorker.SetMainProcess(_VFP)
12531300
lcDirectory = ["] + Evl(lcDirectory, FullPath("")) + ["]
12541301
This.oWorker.DoCmd("CD " + lcDirectory)

parallelfox.vcx

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)