AndreySarafanov
AndreySarafanov

Reputation: 804

Program crashes because of wrong usage of slots and signals

What I'm trying to do is to call an time consuming operation (MockClamWrapper::loadDatabase()) in a separate thread at the moment of creation of my window and then to update my window once the operation is completed. Here is the code that I have.

MockClamWrapper.h

class MockClamWrapper : QObject
{
    Q_OBJECT    
public:
    MockClamWrapper();
    ~MockClamWrapper();
    bool loadDatabase(unsigned int *signatureCount=NULL);
Q_SIGNALS:
    void databaseLoaded();
};

MockClamWrapper.cpp

bool MockClamWrapper::loadDatabase(unsigned int *signatureCount){
    QThread::currentThread()->sleep(10);
    databaseLoaded();
    return true;
}

MainWindow.h

#include <QMainWindow>
#include <QFileDialog>
#include "mockclamwrapper.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
public slots:
    void enableWindow();
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
private:
    Ui::MainWindow *ui;
    MockClamWrapper *clam;
    void initWindow();
};

MainWindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    connect((QObject*)clam, SIGNAL(databaseLoaded()),(QObject*)this,SLOT(enableWindow()));
    QFuture<void> fut = QtConcurrent::run(this,&MainWindow::initWindow);
}

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

void MainWindow::initWindow(){
    clam->loadDatabase(NULL);
}

void MainWindow::enableWindow(){
    ui->checkFileButton->setEnabled(true);
}

The program compiles, but it crashes right after start. I assume that I do something wrong with slots and signals, but can't find my mistake.

Upvotes: 0

Views: 234

Answers (1)

Nejat
Nejat

Reputation: 32665

The reason for crash is that you are not making any instance of the class MockClamWrapper. In the connect statement, you are referencing a pointer that points to nothing. Make a new object and then connect :

clam = new MockClamWrapper();
connect(clam, SIGNAL(databaseLoaded()), this, SLOT(enableWindow()));

Upvotes: 1

Related Questions