Szybki_Jakub Temat założony przez niniejszego użytkownika |
[QT] aplikacja okienkowa i wielowątkowość » 2017-10-31 12:09:45 Witam wszystkich, od kilku dni próbuję stworzyć aplikacje która będzie działała na następującej zasadzie: 1) Jest okno z dwoma elementami, checkbox i push button 2) Jeżeli checkbox jest zaznaczony i naciśniemy push button załącza się wątek w którym znajduje się pętla nieskończona (rozwiązane) 3) Jeżeli odznaczymy checkbox'a i naciśniemy push button wątek wcześniej odpalony wyłącza się w trybie natychmiastowym. Mój kod źródłowy wygląda następująco : void MainWindow::on_pushButton_clicked() { if( ui->checkBox->isChecked() ) { HANDLE hThread =( HANDLE ) _beginthread( ThreadProc, 0, NULL ); } else { _endthread(); } }
program załącza się poprawnie lecz w przypadku kiedy odznaczę checkbox'a i nacisnę przycisk wyłącza się wątek z którego została wywołana funkcja _endThread, w tym przypadku wątek odpowiedzialny za wyświetlenie okna. efektem końcowym jest wyłączenie całego programu. Poszukuję rozwiązania tego problemu lub jakiejś funkcji która byłaby w stanie sterować innymi wątkami, nie tylko swoim. |
|
Anim |
» 2017-10-31 12:19:31 Rzadko mi się zdarza coś pisać w Qt, ale może po prostu zastosuj system sygnałów i slotów? i przypisz je do przycisków? czy do powiedzmy funkcji wykonujących wątek?
Raz przypisana funkcjonalność np. w konstruktorze klasy jest aktywna przez cały czas życia obiektu. Także może to jest rozwiązanie? |
|
Szybki_Jakub Temat założony przez niniejszego użytkownika |
» 2017-10-31 12:26:01 Sugerujesz następujące rozwiązanie? void MainWindow::on_pushButton_clicked() { if( ui->checkBox->isChecked() ) { } else { } }
w takiej sytuacji program się zawiesza |
|
Anim |
» 2017-10-31 13:01:46 bardziej chodzi mi o wykorzystanie funkcji connect: connect( button, SIGNAL( clicked ), nazwa_obiektu_widgeta_obslugujaca watek, SLOT( funkcja obslugujaca_fumkcjonalnosc_watku ) )
Bo w sumie po przeczytaniu dokładnie Twojego problemu to nie do końca go rozumiem... Masz przycisk, który po nacisnięciu załącza drugi wątek? A po kolejnym naciśnięciu chcesz, żeby wątek się wyłączył, jednocześnie nie zamykając aplikacji ? |
|
mateczek |
» 2017-10-31 13:29:02 dziwny miks aplikacja w QT a wątki z winAPI ?? Jeśli nie leżą Ci wątki z Qt to chociaż z biblioteki standardowej zastosuj. https://www.google.pl/search?q=voidrealms+qt+qthread&client=firefox-b-ab&dcr=0&source=lnms&tbm=vid&sa=X&ved=0ahUKEwjM872p75rXAhUkP5oKHWEKDHEQ_AUICigB&biw=1920&bih=947#include "mainwindow.h" #include "ui_mainwindow.h"
MainWindow::MainWindow( QWidget * parent ) : QMainWindow( parent ) , ui( new Ui::MainWindow ) { ui->setupUi( this ); m = new mThreaad( this ); }
MainWindow::~MainWindow() { delete ui; }
void MainWindow::on_pushButton_clicked() { if( m->isRunning() ) { m->quit(); } else m->start(); }
poniżej klasa wątku plik nagłówkowy #ifndef MTHREAAD_H #define MTHREAAD_H
#include <QThread>
class mThreaad : public QThread { Q_OBJECT void run(); public: explicit mThreaad( QObject * parent = nullptr ); signals: public slots: };
#endif
plik implementacji klasy wątku #include "mthreaad.h" #include<QDebug> void mThreaad::run() { qDebug() << "startThread"; exec(); qDebug() << "stopThread"; }
mThreaad::mThreaad( QObject * parent ) : QThread( parent ) { }
|
|
mokrowski |
» 2017-10-31 13:36:07 Jeśli zamierzasz uruchomić wątek roboczy, nie może on bezpośrednio modyfikować elementów GUI. Jest to jasno sprecyzowane w dokumentacji. Przerwanie działania wątku, zrealizujesz przez testowanie w nim flagi zatrzymania lub przesyłając przez postEvent() zdarzenie. Dla QThread jest jeszcze terminate() ale przeczytaj w dokumentacji jakie ma obostrzenia. |
|
Szybki_Jakub Temat założony przez niniejszego użytkownika |
» 2017-10-31 15:15:56 Może bardziej doprecyzuje zagadnienie: potrzebuję aby po naciśnięciu przycisku wykonywała się jakaś operacja w sposób ciągły (np po naciśnięciu przycisku na konsoli zacznie się wyświetlać słowo "abc" co 3 sekundy) dodatkowo nie powinno to zakłócać sprawnego działania okienka. Finalnie ma powstać kilka takich przycisków i nie chcę aby wykonanie ich kolidowało jakkolwiek z działaniem okienka (np nacisnę przycisk abc który co 3 sekundy będzie wyświetlał na konsoli "abc" oraz przycisk 123 który będzie wyświetlał na konsoli "123" w rezultacie na konsoli będzie się wyświetlał napis "abc" co 3 sekundy i napis "123" co dwie) po kolejnym naciśnięciu przycisku (np abc) przestanie wyświetlać się "abc" co 3 sekundy i będzie wyświetlało się tylko "123" co dwie.
Dodam, że jestem początkującym w QT i jedyny sposób jaki znalazłem to wielowątkowość, przy napisaniu surowej funkcji w zdarzeniu click przycisku program się zacina. Byłbym wdzięczny za dogłębne wytłumaczenie jak to zrobić
@mateczek po surowym skopiowaniu Twojego kodu wyskakuje następujący błąd 'm' was not declared in this scope |
|
mateczek |
» 2017-10-31 15:30:50 |
|
« 1 » 2 |