私たちはC#でマルチスレッドのゲームエンジンを開発していますが、STAThread属性が必要(またはSTAを手動でSTAに設定する) -dropサポート(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
さて、更新、描画、およびDoEventsに別々のスレッドを使用するようになりました。それは簡単な解決策でした。また、(実行時に時々呼び出されるCursor.HideやCursor.Showのように、また将来は他の呼び出しでも)STAThreadを必要とする他の呼び出しを行うこともできます。助けてくれてありがとう! – georch