Index: doc/theses/thierry_delisle_PhD/code/readQ_example/proto-gui/main.cpp
===================================================================
--- doc/theses/thierry_delisle_PhD/code/readQ_example/proto-gui/main.cpp	(revision 73fbe91d62a425ae1635a53f34682279e7767750)
+++ doc/theses/thierry_delisle_PhD/code/readQ_example/proto-gui/main.cpp	(revision 6750bcdb1d630bdf635c4e24461723ed4b53777d)
@@ -7,4 +7,6 @@
 #include <memory>
 #include <vector>
+
+#include <getopt.h>
 
 //--------------------
@@ -172,8 +174,67 @@
 
 
-int main() {
+int main(int argc, char * argv[]) {
 	nframes  = 3;
 	fsize    = 1000;
 	nproduce = 60;
+
+	for(;;) {
+		static struct option options[] = {
+			{"buff",  required_argument, 0, 'b'},
+			{"nprod",  required_argument, 0, 'p'},
+			{"fsize",   required_argument, 0, 'f'},
+			{0, 0, 0, 0}
+		};
+
+		int idx = 0;
+		int opt = getopt_long(argc, argv, "b:p:f:", options, &idx);
+
+		std::string arg = optarg ? optarg : "";
+		size_t len = 0;
+		switch(opt) {
+			// Exit Case
+			case -1:
+				/* paranoid */ assert(optind <= argc);
+				goto run;
+			case 'b':
+				try {
+					nframes = std::stoul(optarg, &len);
+					if(nframes == 0 || len != arg.size()) { throw std::invalid_argument(""); }
+				} catch(std::invalid_argument &) {
+					std::cerr << "Number of buffered frames must be at least 1, was" << arg << std::endl;
+					goto usage;
+				}
+				break;
+			case 'p':
+				try {
+					nproduce = std::stoul(optarg, &len);
+					if(nproduce == 0 || len != arg.size()) { throw std::invalid_argument(""); }
+				} catch(std::invalid_argument &) {
+					std::cerr << "Number of produced frames must be at least 1, was" << arg << std::endl;
+					goto usage;
+				}
+				break;
+			case 'f':
+				try {
+					fsize = std::stoul(optarg, &len);
+					if(fsize == 0 || len != arg.size()) { throw std::invalid_argument(""); }
+				} catch(std::invalid_argument &) {
+					std::cerr << "Size of produced frames must be at least 1, was" << arg << std::endl;
+					goto usage;
+				}
+				break;
+			// Other cases
+			default: /* ? */
+				std::cerr << opt << std::endl;
+			usage:
+				std::cerr << "Usage: " << argv[0] << " [options]" << std::endl;
+				std::cerr << std::endl;
+				std::cerr << "  -b, --buff=COUNT    Number of frames to buffer" << std::endl;
+				std::cerr << "  -p, --nprod=COUNT   Number of frames to produce" << std::endl;
+				std::cerr << "  -f, --fsize=SIZE    Size of each frame in bytes" << std::endl;
+				std::exit(1);
+		}
+	}
+	run:
 
 	frames.reset(new Frame[nframes]);
@@ -182,5 +243,6 @@
 		frames[i].data.reset(new unsigned char[fsize]);
 	}
-	std::cout << "Created frames" << std::endl;
+	std::cout << "Created frames of " << fsize << " bytes" << std::endl;
+	std::cout << "(Buffering " << nframes << ")" << std::endl;
 
 	thrdlib_setproccnt( 2 );
