我正在我的服务器上运行一个套接字服务器,我醒来时发现了许多有关其无法访问的消息.事实证明,在我上床睡觉之前,我在窗口中突出显示了一个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时,处理了所有已尝试的连接,然后在处理它们之后,它们被丢弃.这让我想知道,或许,我正在编写错误的应用程序;我需要一个“控制台”线程和一个“服务器”线程.但我不确定这甚至会有所作为.
最佳答案:
在选择模式下,Windows控制台中的任何线程在写入stdout或stderr时都会阻塞.哪个线程无关紧要.
您可以从服务器操作中分离出控制台写入,并确保服务器线程永远不会写入控制台,但是您会引入其他线程管理和消息队列问题.
你可以做大多数人做的事情:使用日志文件.如果您不想在应用程序中构建文件写入,只需将stdout和stderr管道传输到文件,并使用一些Windows等效的tail来监视文件(或像Sublime这样的文本编辑器,它会自动监视打开的文件).
server.exe > server.log 2>&1
为了澄清:2>& 1表示stderr(文件句柄2)应该“合并到”stdout(文件句柄1).
标签:c,console,dllimport 来源: https://codeday.me/bug/20190516/1114735.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。