src/relpipe-out-chart.cpp
author František Kučera <franta-hg@frantovo.cz>
Sat, 29 Sep 2018 14:14:00 +0200
branchv_0
changeset 17 dad72beb3ebe
parent 16 b6f790137bb8
child 18 16784291982f
permissions -rw-r--r--
rename background thread to RelationalReaderThread

#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 RelationalReaderThread : public QThread {
private:
	std::shared_ptr<RelationalReader> reader;
public:

	// TODO: better background thread; lambda?

	RelationalReaderThread(std::shared_ptr<RelationalReader> reader) :
	reader(reader) {
		setTerminationEnabled(true);
	}

	void run() {
		try {
			reader->process();
		} catch (RelpipeReaderException& e) {
			// TODO: handle exception, show error dialog
			std::wcerr << L"RelpipeReaderException: " << e.getMessge() << std::endl;
		}
	}
};

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
	RelationalReaderThread t(reader);
	t.start();
	// ---

	// window.signal123();

	app.exec();
	//return app.exec();

	if (t.isRunning()) {
		std::wcerr << L"Background RelationalReader thread is still running → terminate()" << std::endl;
		t.terminate();
		std::wcerr << L"Background RelationalReader thread was terminated → wait()" << std::endl;
		t.wait();
		std::wcerr << L"Background RelationalReader thread wait() finished" << std::endl;
	}

	return resultCode;
}