如何指定处理器关联?

时间:2010-05-31 16:39:32

标签: c# .net vba access-vba

我的应用程序在处理多处理器系统时遇到了一些问题。这不是一个我对修改有特殊感情的应用程序,如果可能的话我想避免使用它。但是,如果必须的话,我不会在上面修改代码。该应用程序是用VBA编写的(因此我倾向于避免接触它)。

我们已经注意到,如果我们使用任务管理器将处理器关联性设置为单个处理器,那么应​​用程序似乎运行得非常顺利,只有在未设置处理器关联性时才表现出不稳定性。

我知道我可以使用.NET指定任务的处理器关联性,因此,我有可能编写一个shell应用程序,可以用来运行具有指定处理器亲和力的遗留应用程序,有没有人有任何有这方面的经验,可以抛出一些令我头疼的想法,我可能会遇到这种方法吗?

另一个问题是:实际上是否可以修改核心VBA产品以处理其自己的处理器关联?我从来没有用本地任何应用程序来处理这个问题所以这个(此时)完全超出了我的专业领域。

提前致谢

3 个答案:

答案 0 :(得分:2)

您可以使用Sysinternal的PsExec以某种处理器亲和力启动您的应用程序,例如绑定访问CPU 1调用

psexec.exe -a 1 "%ProgramFiles%\Microsoft Office\Office12\access.exe"

回答第二个问题:当您使用 access-vba 标记问题时,我假设您的VBA代码是Access解决方案。然后,您的VBA代码将在进程中执行,即您必须修改access.exe进程的处理器关联。无法单独修改VBA引擎的亲和力。

但是,在指定处理器关联之前,请确保您完全了解其后果。摆弄这个设置可能会产生不良影响。有一个很好的例子,请阅读Raymond Chen的帖子:

  

Psychic debugging: Why your expensive four-processor machine is ignoring three of its processors

答案 1 :(得分:2)

一种方法是使用Windows Application Compatibility Toolkit

您可以使用它来识别您的应用程序(例如通过.exe位置),然后它允许您指定一些调整。处理器亲和力就是其中之一。它创建了一个包含所有调整的数据库。

它是每台机器,因此对于广泛分布的应用程序来说它不是一个好的解决方案,但如果这个应用程序只需要在一台机器上运行,那么它将为您节省更改代码。

答案 2 :(得分:0)

旧线程,但这是一些VBA。它有效,但是我没有写。

Option Compare Database
Option Explicit

Private Declare Function GetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByRef dwProcessAffinityMask As Long, ByRef dwSystemAffinityMask As Long) As Boolean

Private Declare Function SetProcessAffinityMask Lib "kernel32.dll" (ByVal hProcess As Long, ByVal dwProcessAffinityMask As Long) As Boolean

Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long

Public Function SetAffinity()

    Dim hRet As Long
    Dim dwProcMask As Long
    Dim dwSysMask As Long

    hRet = GetProcessAffinityMask(GetCurrentProcess(), dwProcMask, dwSysMask)

    'Set affinity to the first processor
    hRet = SetProcessAffinityMask(GetCurrentProcess(), &H1)

    If hRet <> 0 Then
        MsgBox "Process Affinity successfully set for this application."
    Else
        MsgBox ("Error : " & Err.LastDllError)
    End If

End Function