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

QT C++ Watki Problem

VPS Starter Arubacloud
0 głosów
235 wizyt
pytanie zadane 30 kwietnia 2018 w C i C++ przez neemo Nowicjusz (150 p.)

Witam serdecznie! Po pierwsze jestem tutaj nowy, tak że chciałem się gorąco przywitać:). A po drugie, przechodząc do konkretów to mam problem z uruchomieniem wątków w QT v.4.4.1 pod Win10. Próbuję uruchomić do testów prosty wątek ale nie działa; poniżej przedstawiam kod źródłowy.

Plik mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "worker.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    worker *mWorker = new worker;
    mWorker->moveToThread(&mThread);
    mThread.start();
    connect(ui->pushMetoda1,SIGNAL(clicked()),mWorker,SLOT(metoda1(bool)));
    connect(ui->pushMetoda2,SIGNAL(clicked()),mWorker,SLOT(metoda2(bool)));
    connect(&mThread,SIGNAL(finished()),mWorker,SLOT(deleteLater()));
    connect(mWorker,SIGNAL(rezultat(QStrin)),this,SLOT(thisRezultat(QSting)));
}

MainWindow::~MainWindow()
{
    mThread.quit();
    mThread.wait();
    delete ui;
}

void MainWindow::thisRezultat(QString r)
{
    ui->lineEdit->setText(r);
}

void MainWindow::on_pushButton_clicked()
{
    ui->lineEdit->setText(QString::number((long long)QThread::currentThreadId()));
}

Plik worker.cpp

#include "worker.h"

worker::worker(QObject *parent) : QObject(parent)
{

}

void worker::metoda1(bool)
{
    emit rezultat("jestem metoda 1");
    QThread::sleep(1);
    emit rezultat("ID mojego wątku to:");
    QThread::sleep(1);
    emit rezultat(QString::number((long long)QThread::currentThreadId()));
}

void worker::metoda2(bool)
{
    emit rezultat("jestem metoda 2");
    QThread::sleep(1);
    emit rezultat("ID mojego wątku to:");
    QThread::sleep(1);
    emit rezultat(QString::number((long long)QThread::currentThreadId()));
}

Pliki mainwindow.h i worker.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QThread>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    QThread mThread;

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
private slots:
    void thisRezultat(QString r);
    void on_pushButton_clicked();
};

#endif // MAINWINDOW_H


#ifndef WORKER_H
#define WORKER_H

#include <QObject>
#include <QThread>

class worker : public QObject
{
    Q_OBJECT
public:
    explicit worker(QObject *parent = nullptr);

signals:
    void rezultat(QString r);

public slots:
    void metoda1(bool);
    void metoda2(bool);
};

#endif // WORKER_H

Wygląda na to, że nie uruchamia się w ogóle wątek lub nie działa połączenie connect po naciśnięcia przycisku pushMetoda1.

Z góry dziękuję za pomoc.

2 odpowiedzi

+1 głos
odpowiedź 30 kwietnia 2018 przez Bondrusiek Maniak (61,370 p.)
wybrane 30 kwietnia 2018 przez neemo
 
Najlepsza

Witam,

primo w linii 16 masz błąd literówki:

    connect(mWorker,SIGNAL(rezultat(QStrin)),this,SLOT(thisRezultat(QSting)));

W SIGNAL() rezultat(QString) oraz w SLOT() thisRezultat(QString)

Tu masz tutorial odnośnie QThread

https://www.youtube.com/watch?v=JaGqGhRW5Ks

PS.

Piszę się Qt nie QT.

komentarz 30 kwietnia 2018 przez neemo Nowicjusz (150 p.)

Działa poprawnie, mój głupi błąd literówka i jeszcze miał być typ bool w clicked: 

connect(ui->pushMetoda1,SIGNAL(clicked(bool)),mWorker,SLOT(metoda1(bool)));

Dziękuje bardzo za pomoc.

0 głosów
odpowiedź 30 kwietnia 2018 przez adrian17 Ekspert (344,100 p.)

Raczej częściej używaną metodą jest dziedziczenie po QThread. Probówałeś od tego zacząć?

Patrz tu, trochę niżej: http://doc.qt.io/qt-5/qthread.html#details

ale nie działa

A to nic nikomu nie mówi.

Podobne pytania

0 głosów
2 odpowiedzi 524 wizyt
pytanie zadane 21 czerwca 2017 w C i C++ przez wanttobeanengineer Obywatel (1,120 p.)
0 głosów
1 odpowiedź 403 wizyt
pytanie zadane 18 kwietnia 2020 w C i C++ przez Eriss69 Gaduła (4,470 p.)
+1 głos
1 odpowiedź 267 wizyt
pytanie zadane 6 października 2019 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

92,454 zapytań

141,262 odpowiedzi

319,089 komentarzy

61,854 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.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...