• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Mógłby ktoś mi wytłumaczyć jak napisać wątki tak by nie blokować GUI? [Qt]

0 głosów
661 wizyt
pytanie zadane 8 października 2020 w C i C++ przez NintyS Użytkownik (940 p.)
Dzień dobry, mam pytanie jak napisać wątki w Qt tak żeby nie aplikować GUI? Mam wątek który nie zakończy się nigdy, trzeba go zabić. Kończy się tylko wtedy kiedy jeszcze raz się naciśnie przycisk. poradniki na Yt i na stroni Qt nie dużo mi dają. Mógłby ktoś pokazać przykładowy kod i go omówić?

1 odpowiedź

0 głosów
odpowiedź 8 października 2020 przez tangarr Mędrzec (155,140 p.)
wybrane 8 października 2020 przez NintyS
 
Najlepsza

Jeżeli masz problem z zakończeniem wątku to znaczy, że przeciążyłeś metodę run() i nie uwzględniłeś w niej możliwości zakończenia. W Qt5.2 zostały dodane funkcje QThread::requestInterruption() oraz QThread::isInterruptionRequested()

class Worker : public QObject
{
    Q_OBJECT
protected:
    void run() override {
        while(true) { // pętla główna
             if (isInterruptionRequested())
                 break;
             // kod wątku
        }
    }
}
Worker worker;
worker.start();

// jakiś kod

worker.requestInteruption(); // zlecamy zakończenie wątku
worker.wait() // czekamy aż wątek się zakończy

 

komentarz 8 października 2020 przez adrian17 Mentor (354,800 p.)
Jeszcze raz. Pokaż kawałki kodu (całe funkcje) w których używasz wątki. Bo na razie nie widziałem ani jednego miejsca gdzie używasz wątki, a to są miejsca z których wynika problem.

BTW, zgadzam się z tangarr że użycie QProcess zamiast system() i wątków by prawdopodobnie lepiej ogarnęło zadanie sprowadzające się do uruchomienia ffmpega w tle.
komentarz 8 października 2020 przez NintyS Użytkownik (940 p.)

Z tego co zrozumiałem z tego kursu to dałem to tutaj:

void MainWindow::Recording(){
    v.run();
}

Jak da się uczyć Qproces by komenda terminalowa działała w tle i nie blokowała GUI?
 

komentarz 8 października 2020 przez tangarr Mędrzec (155,140 p.)

W tej sytuacji użycie wątków nie ma sensu.
Uruchamiasz zewnętrzny program i chcesz go kontrolować.

Przykład:

QProcess process;
process.setProgram("sciezka_do_programu");
process.setArguments({"argumenty", "przekazane", "do", "programu"});
process.setWorkingDirectory("katalog_uruchomienia"); // opcjonalne
process.start();

Aby zakończyć proces wykonaj

process.terminate();
process.waitForFinished(); // ta komenda zablokuje GUI

Dodatkowo możesz użyć sygnałów i slotów, żeby uczynić użycie procesów bardziej reaktywnym.
 

komentarz 8 października 2020 przez NintyS Użytkownik (940 p.)
A muszę je dzielić? Nie mogę dać ich jako jeden string?
1
komentarz 8 października 2020 przez tangarr Mędrzec (155,140 p.)
Klasa QProcess pozwala na uruchamianie programów zarówno w sposób blokujący (QProcess::execute) jak i nieblokujący (QProcess::start) oraz dostarcza funkcje do sterowania synchronicznego i asynchronicznego.
Szczerze polecam poczytać dokumentację tej klasy https://doc.qt.io/qt-5/qprocess.html

Edit: Tak, musisz podzielić argumenty

Podobne pytania

0 głosów
1 odpowiedź 2,040 wizyt
pytanie zadane 24 listopada 2015 w Java przez Mikrokontroler xD Stary wyjadacz (13,500 p.)
0 głosów
1 odpowiedź 866 wizyt
pytanie zadane 5 czerwca 2019 w C i C++ przez fennec Nowicjusz (160 p.)
0 głosów
1 odpowiedź 239 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

93,604 zapytań

142,529 odpowiedzi

322,999 komentarzy

63,093 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Kursy INF.02 i INF.03
...