Qt控制台应用程序:while循环阻塞事件循环

msr*_*msr 2 console qt

我正在制作一个控制台应用程序,我用std :: getline()获取用户输入(在while循环中).我也使用QextSerialPort(继承QIODevice).因此我需要一个事件循环,所以我使用QCoreApplication并调用a.exec().

问题是getline()阻塞事件循环,虽然它被阻止,但我无法从串口接收任何东西.我试着用

while(1){getline()}循环中的QCoreApplication :: processEvents(),但发现这不是一个好的解决方案.然后,我试着打电话

QCoreApplication :: processEvents()在QThread中但它不起作用.

这是我使用的代码:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Base *base = new Base();
    Commander *commander = new Commander(base);

    QObject::connect(commander, SIGNAL(end()), &a, SLOT(quit()));
    QTimer::singleShot(0, commander, SLOT(run()));

    return a.exec();
}

void Commander::askToConnect()
{
    if(base->connect() == false){
        cout << "Failed to open port." << endl;
    }
}

void Commander::run{
    string inputline;

    askToConnect();

    while(1){
       QCoreApplication::processEvents();  // ???

       cout << endl << "> ";
       getline(cin, inputline);

       // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如何在不阻塞事件循环的情况下使用getline()(或类似方法)?

KPK*_*KPK 5

是的,我从主线程调用的ProcessEvent()方法获得了类似的经验.问题是它只是放在当前调用堆栈的顶部,并且可能有其他令人讨厌的副作用,如无尽的调用深度或重新进入问题.

我只需在您的应用程序中添加一些线程即可创建一个干净的解决方案.由于getLine()属于(控制台)用户界面,我会将其保留在主线程中并将网络代码移动到额外的线程中,但其他解决方案也是可能的(为所有类型的交互生成线程并且只是将它们从主线).