background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
#include <iostream>
#include <QApplication>
#include <QThread>
#include <relpipe/cli/CLI.h>
#include <relpipe/cli/RelpipeCLIException.h>
#include <relpipe/reader/Factory.h>
#include <relpipe/reader/RelationalReader.h>
#include <relpipe/reader/RelpipeReaderException.h>
#include "RelpipeChartMainWindow.h"
#include "QtRelationalReaderStringHadler.h"
using namespace relpipe::cli;
using namespace relpipe::reader;
class WorkerThread : public QThread {
private:
std::shared_ptr<RelationalReader> reader;
public:
// TODO: better background thread; lambda?
WorkerThread(std::shared_ptr<RelationalReader> reader) :
reader(reader) {
}
void run() {
try {
reader->process();
} catch (RelpipeReaderException& e) {
// TODO: handle exception, show error dialog
}
}
};
int main(int argc, char**argv) {
CLI cli(argc, argv);
// TODO: argument name collisions? Filter arguments? Use prefix for Qt? Qt: -title, -style, -geometry
QApplication app(argc, argv);
std::cout << "TODO: relpipe-out-chart..." << std::endl;
std::shared_ptr<RelationalReader> reader(Factory::create(std::cin));
int resultCode = CLI::EXIT_CODE_UNEXPECTED_ERROR;
RelpipeChartMainWindow window;
// TODO: remove; just demo
QObject::connect(&window, &RelpipeChartMainWindow::signal123, &window, &RelpipeChartMainWindow::slot123);
window.show();
QtRelationalReaderStringHadler handler(&app, &window);
reader->addHandler(&handler);
// Start background thread
WorkerThread t(reader);
t.start();
// ---
// window.signal123();
app.exec();
//return app.exec();
return resultCode;
}