@@ -15,9 +15,9 @@ VERSION = 3.00[END RESERVED1]
1515[BASECLASS] custom
1616[OBJNAME] amanager
1717[START PROPERTIES]
18-
1918Name = "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]
2323PROCEDURE copyarray
@@ -98,6 +98,28 @@ EndFor
9898
9999Return loParameters
100100ENDPROC
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]
103125Class[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]
114138Pixels[END RESERVED6]
@@ -302,10 +326,9 @@ Pixels[END RESERVED6]
302326[BASECLASS] custom
303327[OBJNAME] parallel
304328[START PROPERTIES]
305-
306329Name = "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>
309332cpucount = 0
310333[END PROPERTIES]
311334[START METHODS]
@@ -402,6 +425,15 @@ Debugout Time(0), Program()
402425
403426_Screen.ParPoolMgr.ClearQueue()
404427ENDPROC
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
405437PROCEDURE do
406438* Execute program on worker
407439Lparameters 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+
632666Name = "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>
634668commandqueue =
635669conerror =
636670cworkerclass = WorkerMgr
@@ -1233,9 +1267,15 @@ ENDPROC
12331267PROCEDURE Init
12341268* Create worker process
12351269Lparameters lcProcedureFile, lcDirectory, llDebugMode
1270+ Local lhWndForeground
12361271
12371272Debugout 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.
12401280If llDebugMode and _VFP.StartMode = 0
12411281 Local loVFP as VisualFoxPro.Application, lcWorkerVCX
@@ -1249,6 +1289,13 @@ Else
12491289 This.oWorker = CreateObject(_Screen.ParPoolMgr.cWorkerCOMProgID)
12501290EndIf
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+
12521299This.oWorker.SetMainProcess(_VFP)
12531300lcDirectory = ["] + Evl(lcDirectory, FullPath("")) + ["]
12541301This.oWorker.DoCmd("CD " + lcDirectory)
0 commit comments