只是一个简单的问题。我正在开发一个QT控制台应用程序。现在,我想运行它直到用户按任意键(或者,如果更容易,直到按下回车键)。
应用程序有一个正在运行的事件队列(或更好的两个,一个用于“main”,另一个用于数据解析器)。
以下是代码相关部分的模拟:
的main.cpp
#include <QCoreApplication>
#include <QTimer>
#include "mainprogram.h"
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QCoreApplication::setApplicationVersion("1.0");
MainProgram mainProg(&a);
QTimer::singleShot(0, &mainProg, SLOT(executeMain()));
return a.exec();
}
mainprogram.h
#ifndef MAINPROGRAM_H
#define MAINPROGRAM_H
#include <QObject>
#include <QThread>
#include "datasourceparser.h"
class MainProgram : public QObject
{
Q_OBJECT
public:
explicit MainProgram(QObject *parent = 0);
~MainProgram();
public slots:
void executeMain();
void terminateProgram(int resultCode);
private:
DataSourceParser *dataParser;
QThread dataParserThread;
};
#endif // MAINPROGRAM_H
mainprogram.cpp
#include "mainprogram.h"
#include <QCoreApplication>
MainProgram::MainProgram(QObject *parent) : QObject(parent)
{
}
MainProgram::~MainProgram() {
dataParserThread.quit();
dataParserThread.wait();
}
void MainProgram::executeMain()
{
dataParser = new DataSourceParser();
dataParser->moveToThread(&dataParserThread);
QObject::connect(&dataParserThread, SIGNAL(started()), dataParser, SLOT(execute()));
QObject::connect(&dataParserThread, SIGNAL(finished()), dataParser, SLOT(deleteLater()));
dataParserThread.start();
}
void MainProgram::terminateProgram(int resultCode)
{
QCoreApplication::exit(resultCode);
}
现在,DataSourceParser
完成所有细节。如果某些内容失败,它会使MainProgram::terminateProgram
插槽正常退出,一切正常。
现在,我需要在用户按下某个键时调用该插槽的内容(或者只是输入,如果更容易)。
此解决方案应该是跨平台的(或至少是Windows和Linux x86 / x64)
而且,最重要的是,它不应该阻塞主线程事件队列(因此executeMain()函数内的readline是不可行的。)
谢谢
编辑:
作为Karsten Koop,我尝试添加here找到的QSocketNotifier实现:我复制了头文件和源文件内容(只是将#pragma once
替换为通常的#ifndef CONSOLEREADER_H
等。然后,在致电dataParser->moveToThread(&dataParserThread);
之前,我添加了
ConsoleReader *cr = new ConsoleReader(this);
QSignalMapper *signalMapper = new QSignalMapper(this);
QObject::connect(cr, SIGNAL(textReceived(QString)), signalMapper, SLOT(map()));
signalMapper->setMapping(cr, 1);
this->connect(signalMapper, SIGNAL(mapped(int)), SLOT(terminateProgram(int)));
但是永远不会调用文本槽..