2016-04-14 11 views
0

引数が与えられ、Graphicsのオブジェクトを介して画面にレンダリングするプログラムがあります。私はメインスレッドでConsole.Read()を持っているので、スレッド上ではすべて実行されています。Console.Read()の後でスレッドがスタックする

gw.init(); 
Thread workerThread = new Thread(new ThreadStart(doRenderLoop)); 
workerThread.Start(); 
Console.Read(); 
running = false; 
workerThread.Join(); 

そして、これはレンダリングループです:

try 
    { 
     while (running) 
     { 
      gw.render(); 
      Thread.Sleep(1000/30); 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

そして、これがあるgw.render:

wg.Clear(bgColor); 
wg.Flush(); 

(はbgColorが道でColor.BLACKです)

からタスクマネージャが言うことは、私のウィンドウは問題ありません。 私の窓を見ると、焦点が合っておらず、反応していない状態にとどまるでしょう。 picture

ご協力いただければ幸いです。

EDIT 1:私はエリのポストを試しても、まだ運がありませんでした。これは新しいレンダーループコードです。

gw = new GameWindow(800, 600, "Test"); 
    gw.init(); 
    gw.render(); 
    try 
    { 
     while (running) 
     { 
      gw.render(); 
      Thread.Sleep(1000/30); 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 

私はまだ同じ結果を得ています。コードの最初の3行はメインスレッドにありません。

EDIT 2:私はスレッドを稼働させて、すべてが正しく表示されます。しかし、私はまだ窓に焦点を当てることができないようだ。また、待ち時間が少なすぎて速くなりました。

+0

キーが押されるまでウィンドウを30回レンダリングしますか? GameWindowの基本タイプは何ですか? Init()ではどうなりますか? –

+0

GameWindowは、すべてのグラフィックスを処理するための単なるラッパーでした。 Initはウィンドウを作成して表示し、Renderはうまくレンダリングします。私の計画は、30回/ s、または60回/ sを実行し、コンソールでの入力を待って、プログラムを処分して終了させることでした。また、あなたの投稿はうまくいったが、上の編集で説明されているように、何らかの理由でウィンドウが表示されない。だから私はいくつかのボタンがある場合、私はそれに焦点を当てることができないので、彼らは動作しませんでした。 –

+0

あなたはこれについて間違った方法をとっています。あなたは、コンソールプロジェクトではなくwinformプロジェクトから始める必要があります。これにより、Application.Runのどこかにあなたのウィンドウが表示されます。次に、 'System.Windows.Form.Timer'を追加して、レンダリングメソッドを定期的に呼び出すことができます。プログラムを閉じるには、ウィンドウの「x」を押してください。これらのスレッドはすべて必要はなく、確かにコンソール用ではありません。 –

答えて

0

Console.Readは、入力を受け取るまで呼び出しスレッドをブロックします。コンソールでEnterキーを押すと、移動します。デバッガを接続するまでプログラムを待機させたいときにmain()の先頭に置くことがよくあります。 GWはどのようなタイプ

https://msdn.microsoft.com/en-us/library/system.console.read%28v=vs.110%29.aspx

+0

メインスレッドがウィンドウポンプを呼び出さないかぎり、それはできません。 –

+0

@EliAlgranti - 言い換えれば、 "メッセージをポンピングするためにメインスレッドを使用するプログラムの99.99%にない限り、それはできません"。 – hoodaticus

+1

メッセージポンプを起動する必要があります。グラフィックプログラムでは、現在のコンテキスト(イベントハンドラ)が返ったときにメッセージポンプがメッセージを処理します。コンソールアプリケーションでは、メインスレッドは、プログラムが終了するまで決して戻らないので、メッセージポンプは実行されることはありません。 –

1

のですか? いずれの場合でも、グラフィックオブジェクトはスレッドアフィニティを持っています。つまり、初期化されたスレッドでのみ使用できます。
gwの作成と初期化をワーカースレッドに移動すると、プログラムは期待通りに動作するはずです(おそらく)。

しかし、なぜコンソールを使用するのですか?入力用のテキストフィールドは、このアプリケーションではマルチスレッドを不要にしますか?

+0

彼がコンソールを実行しているスレッドは、おそらくウィンドウメッセージをポンピングするものです。 – hoodaticus

+1

@hoodaticusあなたはおそらく正しいでしょう。なぜ彼は間違ったスレッドで呼び出すための例外を取得していないのか把握しようとしていますか? –

+0

はい、それは非常に良い点です、なぜ私はあなたの答えをupvoted :) – hoodaticus

関連する問題