こんにちは。VB6でソフトを作成しています。
自分の作ったソフトがDualCoreのPCで動作させるとなぜか同期が取れないらしくうまく動作できないので、タスクマネージャのプロセスタブを選択し、実行ファイルの「関係に設定」でCPU0のみにチェックを入れると問題なく動作することが分かりました。
そこで、この操作をVB上のプログラムでできるかを知りたく質問します。
1.実行したPCがMultiCoreの識別をし、
2.MultiCoreの場合、自プロセスをCPU0のみで実行させる。
過去の質問等でタスクマネージャのプロセスの読み出しができることはわかったのですが、書き込むような例がなかったので、困っています。
どなたか助け舟をよろしくお願いします。
プロセッサ(CPU)情報を取得するには
http://tokyo.cool.ne.jp/kanain/APIHTM/CPU.html
CPU0のみ キーワードのみ
「SetThreadAffinityMask」で検索してみてください。
やじゅさん
回答ありがとうございます。
頂いた情報でどうにか動作しました。
「SetThreadAffinityMask」ではどうもうまく動作しなかったので
「SetProcessAffinityMask」で実現しました。
スレッドとプロセスの違いはまだ良く理解できていませんが・・・
参考までに実際のソフトもつけておきます。
もし、怪しい使い方をしているようでしたらご教授ください。
Option Explicit
'SystemInfo構造体の宣言
Private Type SYSTEM_INFO
dwOemID As Long
dwPageSize As Long
lpMinimumApplicationAddress As Long
lpMaximumApplicationAddress As Long
dwActiveProcessorMask As Long
dwNumberOrfProcessors As Long
dwProcessorType As Long
dwAllocationGranularity As Long
wProcessorLevel As Integer
wProcessorRevision As Integer
End Type
'関数の宣言
Private Declare Sub GetSystemInfo Lib "Kernel32.dll" (SystemInfo As SYSTEM_INFO)
Private Declare Function SetProcessAffinityMask Lib "Kernel32.dll" _
(ByVal hProcess As Long, _
ByVal dwProcessAffinityMask As Long) As Boolean
Private Declare Function GetProcessAffinityMask Lib "Kernel32.dll" _
(ByVal hProcess As Long, _
ByRef lpProcessAffinityMask As Long, _
ByRef lpSystemAffinityMask As Long) As Boolean
Private Declare Function GetCurrentProcess Lib "Kernel32.dll" () As Long
Private Sub Form_Load()
Dim System As SYSTEM_INFO '変数の宣言
Dim ProcessAffinityMask As Long
Dim SystemAffinityMask As Long
Dim ret As Boolean
Call GetSystemInfo(System) '情報の取得
If System.dwNumberOrfProcessors > 1 Then ' プロセッサの数が1より多いとき
ret = SetProcessAffinityMask(GetCurrentProcess(), 1) ' CPU#0のみに設定
End If
ret = GetProcessAffinityMask(GetCurrentProcess(), ProcessAffinityMask, SystemAffinityMask)
'結果を表示
Label1.Caption = _
"このPCのプロセッサ数:" & CStr(System.dwNumberOrfProcessors) & vbCrLf & _
"使用するプロセッサマスク:" & CStr(ProcessAffinityMask)
End Sub