自分の作ったEXEがCPU0で実行させるには?

解決


よっすい  2008-03-03 21:44:26  No: 100381  IP: 192.*.*.*

こんにちは。VB6でソフトを作成しています。
自分の作ったソフトがDualCoreのPCで動作させるとなぜか同期が取れないらしくうまく動作できないので、タスクマネージャのプロセスタブを選択し、実行ファイルの「関係に設定」でCPU0のみにチェックを入れると問題なく動作することが分かりました。
そこで、この操作をVB上のプログラムでできるかを知りたく質問します。
1.実行したPCがMultiCoreの識別をし、
2.MultiCoreの場合、自プロセスをCPU0のみで実行させる。
過去の質問等でタスクマネージャのプロセスの読み出しができることはわかったのですが、書き込むような例がなかったので、困っています。
どなたか助け舟をよろしくお願いします。

編集 削除
やじゅ  2008-03-04 12:33:54  No: 100382  IP: 192.*.*.*

プロセッサ(CPU)情報を取得するには
http://tokyo.cool.ne.jp/kanain/APIHTM/CPU.html

CPU0のみ  キーワードのみ
「SetThreadAffinityMask」で検索してみてください。

編集 削除
よっすい  2008-03-04 17:14:36  No: 100383  IP: 192.*.*.*

やじゅさん
回答ありがとうございます。

頂いた情報でどうにか動作しました。
「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

編集 削除