• 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]

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
397 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 (350,400 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ź 1,935 wizyt
pytanie zadane 24 listopada 2015 w Java przez Mikrokontroler xD Stary wyjadacz (13,500 p.)
0 głosów
1 odpowiedź 649 wizyt
pytanie zadane 5 czerwca 2019 w C i C++ przez fennec Nowicjusz (160 p.)
0 głosów
1 odpowiedź 199 wizyt
pytanie zadane 2 kwietnia 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

93,158 zapytań

142,171 odpowiedzi

321,881 komentarzy

62,487 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 224p. - nidomika
  2. 224p. - Marcin Putra
  3. 223p. - dia-Chann
  4. 221p. - ssynowiec
  5. 217p. - Mikbac
  6. 216p. - CC PL
  7. 215p. - Łukasz Piwowar
  8. 212p. - zmmz89
  9. 210p. - Adrian Wieprzkowicz
  10. 208p. - rafalszastok
  11. 206p. - Michal Drewniak
  12. 204p. - Łukasz Eckert
  13. 202p. - rucin93
  14. 200p. - robwarsz
  15. 198p. - TheLukaszNs
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...