Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt控制台应用程序:while循环阻止事件循环_Qt_Console - Fatal编程技术网

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

Qt控制台应用程序:while循环阻止事件循环,qt,console,Qt,Console,我正在制作一个控制台应用程序,在那里我可以获得用户输入 使用std::getline()(在while循环中)。Im还使用QextSerialPort(继承QIODevice)。因此 我需要一个事件循环,所以我使用QCoreApplication并调用a.exec() 问题是getline()阻塞了事件循环,当它被阻塞时,我无法从串行端口接收任何内容。我试着用 QCoreApplication::processEvents()在while(1){getline()}循环中,但发现这不是一个好的解

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

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

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

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

       // ...
    }
}
intmain(intargc,char*argv[])
{
qcorea应用程序(argc、argv);
Base*Base=新的Base();
指挥官*指挥官=新指挥官(基地);
QObject::connect(指挥官、信号(end())、&a、插槽(quit());
QTimer::单发(0,commander,SLOT(run());
返回a.exec();
}
无效指挥官::askToConnect()
{
如果(基本->连接()==false){

cout是的,我在从主线程调用ProcessEvent()方法时也有过类似的经历。问题是它只是放在当前调用堆栈的顶部,可能会产生其他令人讨厌的副作用,如无休止的调用深度或重新进入问题


我只想在应用程序中添加几个线程来创建一个干净的解决方案。因为getLine()属于(控制台)用户界面,所以我会将它保留在主线程中,并将网络代码移动到一个额外的线程中,但也可以使用其他解决方案(为各种交互生成线程,并仅从主线程维护它们).

将通信代码移动到单独的线程通常是个好主意。如果您让它仅通过信号/插槽连接与主线程通信,则可以免费获得线程安全性。我忘了提到:我使用QextSerialPort的readyRead信号异步接收数据。当我从串行端口接收数据时,我会使用qDebug()。但是,一旦事件循环被阻止,它只会在我键入一些内容并按enter键(getline())后打印。这只是因为我在while循环中调用了QCoreApplication::processEvents()。