[Kurs Qt] Procesy

Jeden program by wszystkimi rządzić…

Czasami się zdarza, że musimy kontrolować zewnętrzny proces nienależący bezpośrednio do naszego programu, albo gdy musimy jakoś zareagować na działanie innego programu, który teoretycznie nie ma nic wspólnego z naszym programem wtedy z pomocą przychodzi nam klasa QProcess.

Jeżeli nie potrafisz znaleźć przykładu zastosowania tej klasy w normalnych warunkach to uruchom dowolną grę, które posiada Launcher do aktualizowania samej gry, zauważ że po uruchomieniu gry i w razie jej wysypania bardzo często launcher informuje nas o rodzaju błędu, a przecież jest zewnętrznym programem, który uruchamia inny zewnętrzny program, a właśnie Qt możemy bardzo często spotkać w formie launcherów.

 

Dlaczego się stosuje taką formę?


Inaczej: dlaczego lepiej czasami jest oddzielić 2 programy? Powodów może być tyle co programów, czy programistów. Czasami tak jest po prostu wygodniej. W ten sposób możemy przechwycić dowolne błędy z dowolnego miejsca programu w ten sam sposób, ponieważ program wyrzuci jakiś niepoprawny kod zakończenia programu, co z kolei skutkuje tym że użytkownik dostaje szanse na kliknięcie przycisku „Napraw” w naszym przykładowym launcherze zaraz po wystąpieniu błędu, czyli istnieje mniejsza szansa że użytkownik straci zainteresowanie programem po wystąpieniu błędu, a spróbuje go naprawić albo chociaż wyśle stosowny komunikat do naszej bazy danych z logiem błędu.

Innym powodem może być fakt, że niektóre narzędzia jest wygodniej stworzyć na różnych technologiach i tak np. program rozruchowy napiszemy w c++, czy przy użyciu Qt Creatora, a program który coś ma robić będzie napisany przy użyciu innych bibliotek czy języka programowania.

 

Przygotowanie


Dzisiaj napiszemy sobie program, który dostanie jako linię argumentów zestaw liczb, a jako wyjście odda te liczby skonwertowane odpowiednio na system liczb rzymskich lub arabskich. W przypadku błędnych danych wyświetli logi błędów w drugim oknie.

qprocess

Jak widać nasze okienko składa się raptem z dwóch kontrolek: QLineEdit oraz QPlainTextEdit, gdzie druga jest jedynie do odczytu.

Kod programu, który zamienia liczby na rzymskie jest dostępny poniżej:

 

QProcess


Standardowo includujemy nasza klasę oraz tworzymy wskaźnik na proces:

Przy okazji dodaliśmy 3 sloty, z których później skorzystamy.

W tym programie tworzymy zmienne globalne, które będą przechowywały odpowiednio zwykłe wyjście z zewnętrznego programu jak i komunikaty o błędach.

Dalej łączymy odpowiednie sygnały ze slotami o których powiemy sobie za chwilę.

W tym slocie wszystko się zaczyna, gdzie użytkownik po wciśnięciu [Enter] oczekuje na odpowiednią konwersję podanych argumentów.

Pod zmienną RomArabic  kryje się ścieżka względna do programu, który ma być uruchomiony. arg  to lista argumentów w formie QString, które pobieramy z linii argumentów, kolejnym zabiegiem jest zamiana stringa na listę argumentów, któe przyjmujemy że są oddzielone spacją.

Następnie czyścimy listę argumentów i uruchamiamy proces.

Najważniejszą częścią tej lekcji są 2 funkcje powyżej, mianowicie służą do wczytywania wyjścia drugiego programu, pierwsza służy do wczytywania standardowego wyjścia, czyli tekstu wyświetlanego w konsoli wypisanego przy pomocy np printf(...)  czy cout. Druga służy do wczytania strumienia błędu wypisywanego przy pomocy np. cerr. Oczywiście można też wczytać wszystko bez rozdzielania na strumień standardowy i błędów, przy użyciu readAll() . Te 2 sloty są odpowiednio uruchamiane gdy pojawi się jakieś dane, a uruchamiane są oczywiście dzięki odpowiednim slotom.

Ostatnim slotem jest ten, który uruchamia się po zakończeniu pracy programu, jako argument dostaje kod wyjścia programu.

W razie gdyby pojawiły się jakieś błędne dane wyświetlamy komunikat ze spisem wszystkich błędnych danych.

qprocess-efekt

 

Zakończenie


Oczywiście to nie wszystkie możliwości tej klasy, a jedynie chyba najpopularniejsze.

Dzięki za przeczytanie, jeżeli masz jakiś temat o którym chcesz aby zrobił lekcję daj znać w komentarzach, tak samo jeżeli masz jakieś pytanie odnośnie tej lekcji czy po prostu chcesz podzielić się swoją opinią.

Code ON!