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