Я пишу игру в шахматы, которая позволяет двум программам конкурировать, игрок должен написать DLL и предоставить функцию, чтобы сообщить основному приложению, куда его игрок двинется дальше, предположим, что функция выглядит следующим образом
public static void MoveNext(out int x, out int y, out int discKind);
DLL игрока может быть написана с использованием C # или C ++.
В приложении для игры в шахматы я запускаю новый поток для вызова функции, которую DLL-библиотека игрока открыла, чтобы получить то, где онбудет двигаться по очереди, и я запускаю таймер, чтобы предотвратить тайм-ауты игрока. Если тайм-аут игрока, я убью соответствующий поток, следуя API
thread.Abort();
thread.Join();
У меня есть следующие проблемы, как описано ниже:
Нить не может быть уничтожена со 100% гарантией (это зависит от кода игрока)
Во время теста я обнаружил, что если игрок используетглубокие рекурсии (и если в программе проигрывателя есть утечка памяти), использование памяти хост-приложением увеличится, а затем хост-приложение будет прерванобез каких-либо исключений.
Существуют ли какие-либо методы, идеи или методы, которые могут решить вышеуказанные проблемы?
Из этого CodeInChaos предлагается загрузить DLL проигрывателя в отдельный домен, а затем выгрузить его при необходимости, я не уверен, что он все еще работает для неуправляемой DLL (C ++) а если это приведет к низкой эффективности?