работаю с почтовыми протоколами через сокеты.
есть класс почтового ящика и два класса протоколов (содержащих сокеты), которые работают каждый в своем потоке.
потоки, как и объекты протоколов создаются в конструкторе ящика, и после этого протоколы кидаются в потоки через moveToThread.
в двух словах:
MB::MB () {
imap = new Imap(email, pwd);
ith = new QThread(this);
imap->moveToThread(ith);
ith->start();
}
проблемы возникают при уничтожении объекта почтового ящика. программа вылетает - в 3 случаях из десяти, но это недопустимо. много вариантов перепробовано, но 100% надежный так и не найден.
деструктор ящика:
MB::~MB(){
//
qDebug() << "~MBX";
sth->quit();
sth->wait();
ith->quit();
ith->wait();
delete smtp;
delete imap;
}
деструктор протокола:
Imap::~Imap() {
//
qDebug() << "~IMAP";
socket->close();
socket->deleteLater();
this->deleteLater();
}
ящик удаляется через delete mb;
вопрос, как все-таки составить деструктор ящика, протокола, как правильно закрывать и удалять сокет и как удалять сам ящик, чтобы вся эта связка работала как часы и не заставляла пользователей нервничать, становясь причиной аварийного завершения программы?