2017-05-06 2 views
0

コンソールの別の場所にメッセージを表示したいのですが、カーソル位置を左上50、上60に設定しようとすると、別の場所にあるコンソールにメッセージを表示している別のスレッド「th」があるため、「A」、「B」を印刷してください。また、Cursorプロパティの左と上にもアクセスしています。 私はMan()関数がカーソル位置を設定するときに、その時点で他のスレッドはそれを変更しません。Consoleクラスのプロパティをロックすることで、一度に1つのスレッドだけがアクセスできます

static void Main(string[] args) 
    { 
     Thread th = new Thread(() => new Program().Hello(50, 60)); 
     th.Start(); 
     new Program().Man(); 
    } 
    public void Hello(int left, int top) 
    { 
     int i = 0; 
     Console.CursorLeft = left; Console.CursorTop = top; 
     Console.ForegroundColor = ConsoleColor.DarkGreen;` 
     Console.Write("Processing"); 
     while (true) 
     { 
      i = 0; 
      Console.ForegroundColor = ConsoleColor.DarkGreen; 
      while (i < 20) 
      { 
       Console.Write("*"); 
       i++; 
      } 
      Console.ForegroundColor = ConsoleColor.Black; 
      Console.Write("********************"); 
     } 
    } 

    public void Man() 
    { 
      Console.CursorLeft = 50; 
      Console.CursorTop = 60; 
      Console.Write("A"); 
      Console.Write("B"); 
      Console.Write("C"); 
      Console.Write("D"); 

    } 
+0

ここでは正確に何を達成しようとしていますか? –

+0

コンソールの別の場所にメッセージを表示したいのですが、カーソル位置を50,60に設定しようとすると、メッセージが表示されている別のスレッドがあるため、 'A'、 'B'別の場所にコンソール。 Man()がカーソルの位置を設定するときに、他のスレッドはそれを変更しません。 –

+0

CursorLeftの位置を2回(最初は50に設定してから60に設定する)、これが問題の原因になる可能性がありますか? – BlueStrat

答えて

3

あなたのコードの問題は、 "this"予約語でインスタンスをロックすることです。 Programクラスの2つのインスタンスを作成しているので、 "this"は2つの異なるオブジェクトを参照するため、他のオブジェクトは既に内部にある一方、コードの一部は保持しません。

この問題を解決する1つの方法は、静的オブジェクトをロックすることです。

コードを最適化する方がよいでしょう。

関連する問題