src/relpipe-out-chart.cpp
author František Kučera <franta-hg@frantovo.cz>
Sun, 18 Nov 2018 00:38:49 +0100
branchv_0
changeset 28 04f1ac8a931b
parent 20 b13e7ed9eea3
child 29 0f9f7d6564cd
permissions -rw-r--r--
Qt Charts: first working version
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28
04f1ac8a931b Qt Charts: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 20
diff changeset
     1
#include <sys/prctl.h>
04f1ac8a931b Qt Charts: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 20
diff changeset
     2
#include <stdio.h>
04f1ac8a931b Qt Charts: first working version
František Kučera <franta-hg@frantovo.cz>
parents: 20
diff changeset
     3
#include <unistd.h>
0
ba16fce7ef20 create cmake+netbeans project
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     4
#include <iostream>
ba16fce7ef20 create cmake+netbeans project
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
     5
3
0d857519a4c9 add Qt libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
     6
#include <QApplication>
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
     7
#include <QThread>
3
0d857519a4c9 add Qt libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
     8
2
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
     9
#include <relpipe/cli/CLI.h>
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    10
#include <relpipe/cli/RelpipeCLIException.h>
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    11
#include <relpipe/reader/Factory.h>
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    12
#include <relpipe/reader/RelationalReader.h>
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    13
#include <relpipe/reader/RelpipeReaderException.h>
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    14
4
1622c087f3ea add main window, compile Qt .ui file
František Kučera <franta-hg@frantovo.cz>
parents: 3
diff changeset
    15
#include "RelpipeChartMainWindow.h"
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    16
#include "QtRelationalReaderStringHadler.h"
2
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    17
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    18
using namespace relpipe::cli;
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    19
using namespace relpipe::reader;
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    20
20
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    21
// signal/slot parameters must be declared here and registered with qRegisterMetaType()
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    22
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    23
Q_DECLARE_METATYPE(string_t)
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    24
Q_DECLARE_METATYPE(std::vector<AttributeMetadata>)
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    25
17
dad72beb3ebe rename background thread to RelationalReaderThread
František Kučera <franta-hg@frantovo.cz>
parents: 16
diff changeset
    26
class RelationalReaderThread : public QThread {
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    27
private:
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    28
	std::shared_ptr<RelationalReader> reader;
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    29
public:
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    30
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    31
	// TODO: better background thread; lambda?
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    32
17
dad72beb3ebe rename background thread to RelationalReaderThread
František Kučera <franta-hg@frantovo.cz>
parents: 16
diff changeset
    33
	RelationalReaderThread(std::shared_ptr<RelationalReader> reader) :
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    34
	reader(reader) {
16
b6f790137bb8 Do not destroy background thread before application end.
František Kučera <franta-hg@frantovo.cz>
parents: 13
diff changeset
    35
		setTerminationEnabled(true);
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    36
	}
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    37
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    38
	void run() {
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    39
		try {
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    40
			reader->process();
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    41
		} catch (RelpipeReaderException& e) {
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    42
			// TODO: handle exception, show error dialog
16
b6f790137bb8 Do not destroy background thread before application end.
František Kučera <franta-hg@frantovo.cz>
parents: 13
diff changeset
    43
			std::wcerr << L"RelpipeReaderException: " << e.getMessge() << std::endl;
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    44
		}
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    45
	}
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    46
};
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    47
0
ba16fce7ef20 create cmake+netbeans project
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    48
int main(int argc, char**argv) {
2
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    49
	CLI cli(argc, argv);
9
d88df75dc2eb comment on possible CLI argument collision
František Kučera <franta-hg@frantovo.cz>
parents: 4
diff changeset
    50
	// TODO: argument name collisions? Filter arguments? Use prefix for Qt? Qt: -title, -style, -geometry
3
0d857519a4c9 add Qt libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 2
diff changeset
    51
	QApplication app(argc, argv);
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    52
2
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    53
	std::shared_ptr<RelationalReader> reader(Factory::create(std::cin));
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    54
	int resultCode = CLI::EXIT_CODE_UNEXPECTED_ERROR;
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    55
4
1622c087f3ea add main window, compile Qt .ui file
František Kučera <franta-hg@frantovo.cz>
parents: 3
diff changeset
    56
	RelpipeChartMainWindow window;
1622c087f3ea add main window, compile Qt .ui file
František Kučera <franta-hg@frantovo.cz>
parents: 3
diff changeset
    57
	window.show();
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    58
20
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    59
	RelationalReaderThread t(reader);
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    60
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    61
	// Proxy that passes calls from the background thread to the GUI thread using signal-slot mechanism:
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    62
	QtRelationalReaderStringHadler handler(&t); // &t instead of handler.moveToThread(&t); // QObject::moveToThread: Cannot move objects with a parent
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    63
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    64
	// see Q_DECLARE_METATYPE above
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    65
	qRegisterMetaType<string_t>();
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    66
	qRegisterMetaType<std::vector < AttributeMetadata >> ();
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    67
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    68
	QObject::connect(&handler, &QtRelationalReaderStringHadler::startRelationReceived, &window, &RelpipeChartMainWindow::startRelation, Qt::ConnectionType::QueuedConnection);
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    69
	QObject::connect(&handler, &QtRelationalReaderStringHadler::attributeReceived, &window, &RelpipeChartMainWindow::attribute, Qt::ConnectionType::QueuedConnection);
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    70
	QObject::connect(&handler, &QtRelationalReaderStringHadler::endOfPipeReceived, &window, &RelpipeChartMainWindow::endOfPipe, Qt::ConnectionType::QueuedConnection);
b13e7ed9eea3 better use of signal/slot mechanism, threads, Qt::ConnectionType::QueuedConnection
František Kučera <franta-hg@frantovo.cz>
parents: 19
diff changeset
    71
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    72
	reader->addHandler(&handler);
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    73
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    74
	// Start background thread
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    75
	t.start();
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    76
19
ac70c7af6a9b code clean-up, exit code
František Kučera <franta-hg@frantovo.cz>
parents: 18
diff changeset
    77
	int qtResultCode = app.exec();
13
c84042d014c9 background thread for STDIN reading + proxy with signals/slots for passing data to the GUI thread
František Kučera <franta-hg@frantovo.cz>
parents: 11
diff changeset
    78
19
ac70c7af6a9b code clean-up, exit code
František Kučera <franta-hg@frantovo.cz>
parents: 18
diff changeset
    79
	if (qtResultCode == 0) {
ac70c7af6a9b code clean-up, exit code
František Kučera <franta-hg@frantovo.cz>
parents: 18
diff changeset
    80
		resultCode = CLI::EXIT_CODE_SUCCESS;
ac70c7af6a9b code clean-up, exit code
František Kučera <franta-hg@frantovo.cz>
parents: 18
diff changeset
    81
	} else {
ac70c7af6a9b code clean-up, exit code
František Kučera <franta-hg@frantovo.cz>
parents: 18
diff changeset
    82
		// TODO: report and log Qt errors if any
ac70c7af6a9b code clean-up, exit code
František Kučera <franta-hg@frantovo.cz>
parents: 18
diff changeset
    83
	}
2
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    84
16
b6f790137bb8 Do not destroy background thread before application end.
František Kučera <franta-hg@frantovo.cz>
parents: 13
diff changeset
    85
	if (t.isRunning()) {
b6f790137bb8 Do not destroy background thread before application end.
František Kučera <franta-hg@frantovo.cz>
parents: 13
diff changeset
    86
		std::wcerr << L"Background RelationalReader thread is still running → terminate()" << std::endl;
b6f790137bb8 Do not destroy background thread before application end.
František Kučera <franta-hg@frantovo.cz>
parents: 13
diff changeset
    87
		t.terminate();
b6f790137bb8 Do not destroy background thread before application end.
František Kučera <franta-hg@frantovo.cz>
parents: 13
diff changeset
    88
		std::wcerr << L"Background RelationalReader thread was terminated → wait()" << std::endl;
b6f790137bb8 Do not destroy background thread before application end.
František Kučera <franta-hg@frantovo.cz>
parents: 13
diff changeset
    89
		t.wait();
b6f790137bb8 Do not destroy background thread before application end.
František Kučera <franta-hg@frantovo.cz>
parents: 13
diff changeset
    90
		std::wcerr << L"Background RelationalReader thread wait() finished" << std::endl;
b6f790137bb8 Do not destroy background thread before application end.
František Kučera <franta-hg@frantovo.cz>
parents: 13
diff changeset
    91
	}
b6f790137bb8 Do not destroy background thread before application end.
František Kučera <franta-hg@frantovo.cz>
parents: 13
diff changeset
    92
2
7ba3ae8cf1fc add relpipe pkg-config libraries using cmake
František Kučera <franta-hg@frantovo.cz>
parents: 1
diff changeset
    93
	return resultCode;
0
ba16fce7ef20 create cmake+netbeans project
František Kučera <franta-hg@frantovo.cz>
parents:
diff changeset
    94
}