Как запустить приложение на определенном процессоре
От: Американец  
Дата: 25.03.09 17:53
Оценка: 6 (1)
Приложение на C# создает COM объект посредством interop и вызывает его функции.
Приложение предоставляющее COM интерфейс стороннее и в нем ничего не изменить.
На машине с одним процессором все работает как надо, но в двухъядерной
системе переодически возникает проблема при обращении к COM объекту и вылетает исключение:

System.Runtime.InteropServices.COMException' in ...
ErrorCode: HRESULT 0x8000FFFF
Message: "Ошибка входа в критическую секцию из-за потока 2900, функция "TListEx.Lock"

а иногда поток и вовсе зависает в неуправляемом коде. Никакие манипуляции с потоковыми
аппартаментами не помогают.
Единственная безумная идея это заставить оба приложения полностью выполняться на одном
и том же процессоре (включая все рабочие потоки приложений), но что для этого сделать
непридумаю никак, подскажите какие варианты есть или где читать ?
c# com processor thread
Re: Как запустить приложение на определенном процессоре
От: adontz Грузия http://adontz.wordpress.com/
Дата: 25.03.09 17:55
Оценка: 3 (1)
Здравствуйте, Американец, Вы писали:

SetProcessAffinityMask
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Как запустить приложение на определенном процессоре
От: Американец  
Дата: 26.03.09 06:22
Оценка:
Спасибо, заработало. Можно избавиться от SetProcessAffinityMask используя готовые обертки из фрейморка:

private void SetProcessToCPU(string processName)
{   
    IntPtr cpu = new IntPtr(1); // Номер(а) процессра(ов)
    Process[] processes = Process.GetProcessesByName(processName);

    foreach (Process p in processes)
        p.ProcessorAffinity = cpu;    // Всех с таким именем на один процессор, если есть права конечно

    // Лучше конечно установить процессор только для рабочего потока а не для всего процесса приложения
    Process.GetCurrentProcess().ProcessorAffinity = cpu;  
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.