2016-12-29 11 views
1

私はRTBを使用してコンソールをシミュレートした小さなゲームで作業しています。ゲーム自体は、コンソールに出力するためのAPI関数を呼び出すLUAスクリプトを実行します。このAPIは、コンソールクラスによってピックアップされたイベント(caliburn microを使用)を起動し、メッセージはRTBに追加されます。RTBに印刷された文字の間に遅延を追加します

メッセージの各文字の間に小さな遅延を追加して、もう少し効果を与えたいと思っています。残念ながら、私はこれでレンガの壁を多少打った。私は簡単に2番目のスレッドとスリープ、またはタイマーを使用して文字の間に遅延を追加することができます。スクリプトが2つのメッセージをコンソールに送信すると、遅いものと同じ時刻に2番目のメッセージが処理され、テキストが文字化けして出力されるという問題にぶつかります。

私は後で、メッセージの中に文字が印刷される間に少しの遅延を持たせる方法ですが、コンソールに出力するための後続の呼び出しを処理する前に終了するまで待機します。

スレッディングは、実際には基本レベルでしか使用していないものです。私は基本的な概念を理解していると思います。しかし、これは私にいくつかの問題を与えている。遅延スレッドが完了するのを待つと、メインスレッドがブロックされ、何も出力されません(したがって、プログラム全体が永遠にハングします)。

うまくいけば、私は十分に説明しました。どんな助けもありがとうございます。

+0

Thread.Sleep&lock()文を見てください - 私たちもコードを見せてください。 –

答えて

2

ここで使用したいのはキューですが、ロックしたくない場合はparralelQueueです。

イベントハンドラはメッセージをキューに追加するだけで、別のプロセスがメッセージを読み込み、キューに項目がある限りゆっくりと印刷します。以下は、parralelQueueを使用してこれを行う方法の例です。

using System.Threading; 
using System.Threading.Tasks; 
using System.Collections.Concurrent; 

ConcurrentQueue<string> MessageQueue; 
ManualResetEventSlim queRefilled = new ManualResetEventSlim(false); 
bool writerStopper; 
Task messageWriter; 

private void MessageDispatcher() //this is going to be the writing thread 
{ 
    while (!writerStopper) 
    { 
     if(MessageQueue.Count ==0) 
     { 
      //loop every 200 seconds to check the writerStopper 
      if (!queRefilled.Wait(200)) //wait until we know that a message has been added, this was done to minimize latency. 
       continue; 
      queRefilled.Reset(); 
      continue; 
     } 
     string message; 
     if (MessageQueue.TryDequeue(out message)) 
      yourWriteMethod(message); //here you can call your existing writer 
    } 
} 
//call this to add a message to the screen 
public void QueueToScreen(string message) 
{ 
    MessageQueue.Enqueue(message); 
    queRefilled.Set(); //set the flag so that the writer knows that there are messages 
} 

public void start() 
{ 
    MessageQueue = new ConcurrentQueue<string>(); 
    writerStopper = false; 
    messageWriter = new Task(MessageDispatcher); 
    messageWriter.Start(); 
} 

    public void stop() 
{ 
    writerStopper = true; 
    MessageQueue = null; 
} 

このコードトライのManualResetEventSlimでの待ち時間を最小限に抑えます。また、単にthread.sleepを使用することもできますが、応答がやや遅くなります。また、私は怠惰なのでcancelationTokensを無視しました。メインアプリケーションの前にトレッドを止めたくない場合は、while(true)とqueRefilled.Wait()を無限に使用することができます。

+0

これは魅力的に機能しました。 Idはいくつかのフォームをキューシステムで動作させていましたが、ロックしているものはいつもつまずきました。これはうまく解決します。ありがとう! – Ben

関連する問題