Co do samego tematu, załączony kod jest niekompletny. Tekst wspomina, coś o wątkach, ale ani jedna linka tego kodu na to nie wskazuje,
Mało tego, tekst mówi o problemach z zarządzanie czasem życia obiektu, a jedyny ślad kody z tym związany to definicja jakiegoś destruktora klasy, która nie wiadomo jak jest połączona z resztą kodu,
Sorka za skromy fragment kodu, nie chciałem zaśmiecać, to wygląda tak:
// OKNO CZATU
void ChatWindow::makeThread()
{
messagesController = new MessagesController(converserId, lastReadMessageId);
QThread *thread = new QThread;
messagesController->moveToThread(thread);
connect(thread, &QThread::started, messagesController, &MessagesController::run);
connect(messagesController, &MessagesController::wroteNewMessageInDatabase, this, &ChatWindow::readNewMessages);
thread->start();
}
// desktruktor tego okna jest wywoływany po naciśnięciu na 'X' dzięki poniższej metodzie
void closeEvent(QCloseEvent *event) { this->deleteLater(); }
// destruktor wygląda tak, po zamknięciu okna czatu chcę usunąć obiekt skojarzony z drugim wątkiem
ChatWindow::~ChatWindow()
{
messagesController->~MessagesController();
delete ui;
MainWindow::activeWindowsList.removeOne(converserId);
}
// KLASA KONTROLERA SPRAWDZAJĄCEGO CZY SĄ NOWE WIADOMOŚCI
#include <QDebug>
#include <QSqlQuery>
#include <QString>
#include "messagescontroller.h"
#include "loginpage.h"
MessagesController::MessagesController(quint32 converserId, quint32 lastReadMessageId, QObject *parent)
: QObject{parent},
converserId{converserId},
lastReadMessageId{lastReadMessageId}
{
database = QSqlDatabase::addDatabase("QMYSQL", QString("messagesControllerThreadUser%1").arg(converserId));
}
MessagesController::~MessagesController()
{
database = QSqlDatabase();
QSqlDatabase::removeDatabase(QString("messagesControllerThreadUser%1").arg(converserId));
qDebug() << "Removed " + QString("messagesControllerThreadUser%1").arg(converserId);
}
void MessagesController::run()
{
qDebug() << QString("messagesControllerThreadUser%1").arg(converserId);
checkNewMessages();
}
void MessagesController::checkNewMessages()
{
QString messageIdQuery = "SELECT message_id FROM " + QString::number(LoginPage::getUserId()) + "_chat_" + QString::number(converserId);
LoginPage::connectToDatabase(database);
QSqlQuery query(database);
//while(true)
for (int i = 0; i < 1000; i++)
{
if (query.exec(messageIdQuery))
{
if (query.size() > 0)
{
query.last();
qDebug() << query.value("message_id").toUInt();
if (query.value("message_id").toUInt() > lastReadMessageId)
{
emit wroteNewMessageInDatabase();
}
}
}
}
}
Czyli z grubsza... Gdy otwierane jest okno czatu z konkretnym użytkownikiem, tworzony ma być nowy wątek sprawdzający nowe wiadomości, a w chwili zamknięcia okna czatu wątek i połączenie z bazą powinny być usuwane.