虽然异步IO(带有select/poll/epoll/kqueue等的非阻塞描述符)并不是Web上记录最多的东西,但有一些很好的例子.
但是,所有这些示例在确定了调用返回的句柄后,只有一个do_some_io(fd)
"存根".它们并没有真正解释如何在这种方法中最好地接近实际的异步IO.
阻止IO非常整洁,直接读取代码.另一方面,非阻塞,异步IO是毛茸茸的,凌乱的.
有什么办法?什么是健壮和可读的?
void do_some_io(int fd) {
switch(state) {
case STEP1:
... async calls
if(io_would_block)
return;
state = STEP2;
case STEP2:
... more async calls
if(io_would_block)
return;
state = STEP3;
case STEP3:
...
}
}
Run Code Online (Sandbox Code Playgroud)
或者(ab)使用GCC的计算得到的:
#define concatentate(x,y) x##y
#define async_read_xx(var,bytes,line) \
concatentate(jmp,line): \
if(!do_async_read(bytes,&var)) { \
schedule(EPOLLIN); \
jmp_read = &&concatentate(jmp,line); \
return; \
}
// macros for making async code read like sync code
#define async_read(var,bytes) \
async_read_xx(var,bytes,__LINE__)
#define async_resume() \
if(jmp_read) { \
void* …
Run Code Online (Sandbox Code Playgroud) 我正在写一个服务器(主要用于Windows,但如果我可以保持多平台,这将很酷)我只是使用一个普通的控制台窗口.但是,我希望服务器能够执行诸如text_to_say_here或kick playername等命令.我怎样才能有异步输入/输出?我已经尝试了普通的printf()和gets_s的一些东西但是这导致了一些非常奇怪的东西.
我的意思是这样的事1
谢谢.
对于我正在进行的项目,我需要程序能够接收来自用户的输入,但是当他们输入内容时,程序可以继续循环.
例如:while (true)
{
if (userInput == true)
{
cin >> input
}
//DO SOMETHING
}
Run Code Online (Sandbox Code Playgroud)
这意味着//DO SOMETHING
每次循环都会发生这种情况,而用户不会按下百万次输入.
kbhit()
和getch()
从conio.h 创建我自己的输入,但是这非常混乱,我不喜欢使用conio.h以便于携带等.此外,它不需要cin
专门使用,因为那里是一个很好的机会它只是不能用它,所以任何好的解决方案,不需要我用"不太好"的库自己输入,将非常感激. 我正在开发一个程序,它将从控制台接收用户输入并在单独的线程中打印出来。我想避免用户在输入内容的过程中出现 printf 出现并在光标处打印自身的情况。
有没有办法从控制台窗口执行 c 中的非阻塞 io?理想情况下,捕获按键或类似的操作,以便用户键入的内容不会出现在屏幕上。我正在 Ubuntu 中进行开发,最好不必使用 ncurses 之类的东西。
如何在不导致代码停止执行的情况下输入输入?我一直在寻找答案,在过去的20分钟内没有结果.
cin >> string;
暂停代码AFAIK.
我需要使用多线程,还是有更好的方法?(我甚至不知道多线程是否有效.)
我最近开始学习c ++,至少可以说是初学者,所以请详细解释并包含我可能需要的任何库,谢谢.