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

时间:2011-08-05 13:07:22

标签: qt console

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

问题是getline()阻塞了事件循环,当它被阻止时,我无法从串口接收任何东西。我试着用

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

QTore中的QCoreApplication :: processEvents()但它没有 工作

以下是我使用的代码:

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);

       // ...
    }
}

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

1 个答案:

答案 0 :(得分:5)

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

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