首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制台选择停止应用程序

控制台选择停止应用程序
EN

Stack Overflow用户
提问于 2016-11-02 17:23:49
回答 2查看 2.3K关注 0票数 7

我正在我的服务器上运行一个套接字服务器,我发现很多关于它的不可访问性的消息。结果,在我上床睡觉之前,我在窗口高亮显示了一个IP地址,忘了按Enter键继续这个过程。

这就是我现在在控制台中禁用选择的方式,但我仍然希望能够在不暂停应用程序的情况下进行选择。

代码语言:javascript
复制
    #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);
    }

我真的不想回到命令提示符的遗留模式,因为它确实有助于拥有这些新特性(特别是对于devs),但是我需要找到一种方法来防止应用程序在我暂停控制台时停止。有趣的是,当我今天早上点击Enter时,所有尝试过的连接都被处理了,然后在它们被处理之后,它们被删除了。这让我怀疑,也许我写错了应用程序;我需要一个“控制台”线程和一个“服务器”线程。但我不确定这能有什么区别。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-02 17:42:51

当处于选择模式时,Windows控制台中的任何线程在编写stdoutstderr时都会阻塞。不管是哪根线。

您可以将控制台写入与服务器操作分开,并确保服务器线程从未写入控制台,但随后引入了额外的线程管理和消息队列问题。

你可以做大多数人所做的事情:使用日志文件。如果您不想构建写入应用程序的文件,只需将stdoutstderr输送到一个文件中,并使用一些与tail相当的tail来监视该文件(或者像Sublime这样的文本编辑器自动监视打开的文件)。

代码语言:javascript
复制
server.exe > server.log 2>&1

澄清:2>&1表示stderr (文件句柄2)应该“合并到”stdout (文件句柄1)中。

票数 8
EN

Stack Overflow用户

发布于 2019-09-11 08:50:18

对于简单的工具,在不同的线程中执行控制台写操作确实是最简单的。样本代码:

代码语言:javascript
复制
    static BlockingCollection<string> messageQueue = new BlockingCollection<string>(new ConcurrentQueue<string>());
    static Task messagePrinterTask;
    private static void ConsoleWriteLine(string s)
    {
        messageQueue.Add(s);
    }
    private static void StartMessageQueuePrinter()
    {
        messagePrinterTask = Task.Run(() =>
        {
            try { while(true) Console.WriteLine(messageQueue.Take()); }
            catch (InvalidOperationException) { } //CompleteAdding called.
        });
    }
    private static void StopMessageQueuePrinter()
    {
        messageQueue.CompleteAdding();
        messagePrinterTask.Wait();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40386056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档