Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[QT] aplikacja okienkowa i wielowątkowość

Ostatnio zmodyfikowano 2017-10-31 17:36
Autor Wiadomość
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 :
C/C++
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.
P-166277
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?
P-166278
Szybki_Jakub
Temat założony przez niniejszego użytkownika
» 2017-10-31 12:26:01
Sugerujesz następujące rozwiązanie?

C/C++
void MainWindow::on_pushButton_clicked()
{
    if( ui->checkBox->isChecked() ) {
        //ciało funkcji
    } else {
       
    }
}

w takiej sytuacji program się zawiesza
P-166279
Anim
» 2017-10-31 13:01:46
bardziej chodzi mi o wykorzystanie funkcji connect:


C/C++
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 ?
P-166280
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=0ahUKEwjM872p75rXAhUkP5oKH​WEKDHEQ_AUICigB​&biw=1920&bih=947

C/C++
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow( QWidget * parent )
    : QMainWindow( parent )
     , ui( new Ui::MainWindow )
{
    ui->setupUi( this );
    m = new mThreaad( this ); //tworzenie wątku w konsturkorze
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pushButton_clicked()
{
    if( m->isRunning() ) {
        m->quit(); // jeśli pracuje zatrzymaj
    } else m->start(); //jeśli nie pracuje odpal
   
}


poniżej klasa wątku plik nagłówkowy
C/C++
#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 // MTHREAAD_H


plik implementacji klasy wątku

C/C++
#include "mthreaad.h"
#include<QDebug>
void mThreaad::run()
{
    qDebug() << "startThread";
   
    exec();
    qDebug() << "stopThread";
}

mThreaad::mThreaad( QObject * parent )
    : QThread( parent )
{
   
}
P-166281
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.
P-166282
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
P-166283
mateczek
» 2017-10-31 15:30:50
może potrzebujesz tylko timera a nie wątków??.

Cały projekt tutaj:
https://chomikuj.pl​/mysiadziura​/www.marekk.dreamhosters.com​/nienazwany3,6133592123.zip(archive)
pooglądaj te filmiki o Qt i sobie wybierz co jak byś to chciał rozwiązać. Ewentualnie wątki z biblioteki standardowej.
P-166284
« 1 » 2
  Strona 1 z 2 Następna strona