우리는 C#으로 멀티 스레드 게임 엔진을 개발 중입니다. 우리는 STAThread 속성이 필요하거나 수동으로 스레드를 STA에 설정해야 드래그 앤드 드롭 지원 (AllowDrop은 STA없이 설정할 수 없습니다). 그러나 STA를 사용하고 업데이트 방법이 draw 방법보다 오래 걸리는 경우 (아래에 설명) 창의 창이 제대로 작동하지 않습니다. 작업 표시 줄에서 클릭 할 때 예상대로 최소화 및 최대화되지 않습니다. 그것. 정확한 동작은 서로 다른 시스템에서 다르기 때문에 어떤 종류의 경쟁 조건이 여기에 작용할 것입니다.STA를 사용할 때 이상한 행동을하고 스레드가 너무 오래 걸리는 경우
나는이 문제를 인식[STAThread]
public static void Main()
{
Form form = new Form();
form.Show();
Barrier barrier = new Barrier(2);
Thread updateThread = new Thread(() => {
while (true)
{
barrier.SignalAndWait();
Thread.Sleep(30); //Update
barrier.SignalAndWait();
}
});
updateThread.Start();
while (true)
{
barrier.SignalAndWait();
Thread.Sleep(15); //Draw
barrier.SignalAndWait();
Application.DoEvents();
}
}
흠, 먼저 우리는 Barrier.SignalAndWait에서 벗어나서 별도의 스레드를 사용하여 응용 프로그램을 실행하려고합니다. 이벤트 루프가 실행되는 동안 DirectX/OpenGL이 표시 될 수 있는지 여부를 확인해야합니다. 그렇지 않으면, 우리는 귀하의 접근 방식을 시도 할 것입니다. 나는 우리가 시험을 마치면 (즉 오늘 저녁에) 당신의 답을 받아 들일 것입니다. – georch
이제 우리는 update, draw 및 DoEvents에 별도의 스레드를 사용합니다. 그게 더 쉬운 솔루션이었고, 또한 우리는 STAThread (Cursor.Hide와 Cursor.Show 같은 호출은 때때로 실행 중에 호출되어야 함)를 필요로하는 다른 호출을 만들 수 있습니다. 도움을 많이 주셔서 감사합니다! – georch