2016-11-02 5 views
4

私は自分のサーバー上でソケットサーバーを実行しています。私が寝る前に、ウィンドウのIPアドレスを強調表示し、Enterキーを押してプロセスを再開するのを忘れたことが判明しました。コンソールの選択がアプリケーションを停止します

これはコンソールでの選択を無効にする方法ですが、まだアプリケーションを一時停止せずに選択できるようにしたいと考えています。

#region Disable Quick-Edit Mode 
    [DllImport("kernel32.dll")] 
    static extern bool SetConsoleMode(IntPtr hConsoleHandle, int mode); 

    [DllImport("kernel32.dll")] 
    static extern bool GetConsoleMode(IntPtr hConsoleHandle, out int mode); 

    [DllImport("kernel32.dll")] 
    static extern IntPtr GetStdHandle(int handle); 

    const int STD_INPUT_HANDLE = -10; 
    const int ENABLE_EXTENDED_FLAGS = 0x80; 

    public static void DisableQuickEditMode() 
    { 
     int mode; 
     IntPtr handle = GetStdHandle(STD_INPUT_HANDLE); 
     GetConsoleMode(handle, out mode); 
     mode |= ENABLE_EXTENDED_FLAGS; 
     SetConsoleMode(handle, mode); 
     mode &= ~ENABLE_QUICK_EDIT; 
     SetConsoleMode(handle, mode); 
    } 

私は本当にそれが本当にこれらの新機能を(特に開発者のために)持っているのに役立ちないため、コマンドプロンプトのレガシーモードに戻りたいとは思いませんが、私は予防する方法を見つける必要がありますコンソールを一時停止すると、アプリケーションは停止しません。興味深いのは、今朝私がEnterキーを押すと、試行されたすべての接続が処理され、処理された後に削除されたということです。おそらく、私はアプリケーションを間違って書いているのだろうかと思います。私は "コンソール"スレッドと "サーバー"スレッドが必要です。しかし、私はそれが違いを生むかもしれないとは思っていません。

+1

これはWindows上で実行されるすべてのコンソールプログラムで起こります。単に選択した結果として新しい出力が表示されなくなるため、結果的に 'Console.WriteLine()'のような呼び出しができなくなります。フル。この質問はプログラミングとは関係ありません。 WIndowsの基本的なユーザートピックです。 –

+0

ああ申し訳ありません。私はそれが事実であるとは決して考えなかった。私は非常に頻繁にコンソールアプリケーションを使用していないと私はほとんどのプログラマーがそれのためのハックを持っていたと仮定した。恩赦。 – Fuselight

答えて

5

選択モードでは、stdoutまたはstderrを書き込むときにWindowsコンソールのスレッドがブロックされます。どのスレッドでも問題ありません。

コンソール操作の書き込みをサーバー操作から切り離して、サーバースレッドがコンソールに書き込まないようにすることができますが、追加のスレッド管理とメッセージキューの問題が発生する可能性があります。

ほとんどの人が行うことができます:ログファイルを使用します。アプリケーションにファイル書き込みを作成したくない場合は、stdoutstderrをファイルにパイプし、tailのWindows対応版を使用してファイル(または開いているファイルを自動的に監視するSublimeのようなテキストエディタ)を監視します。明確にするために

server.exe > server.log 2>&1 

2>&1stderr(ファイルハンドル2)stdout(ファイルハンドル1) "にマージ" されなければならないことを示しています。

+0

思考のための食品。ありがとう! – Fuselight

関連する問題