क्लीनअप को विनाशकों और बाल-अभिभावक संबंधों द्वारा संभाला जाना चाहिए।
अपने मास्टर ऑब्जेक्ट (मुख्य में से एक) को QApplication के बच्चे बनाएं ताकि QAplication से पहले यह अपने सभी बच्चों के साथ नष्ट हो जाए।
क्या आप वाकई अपने सभी धागे को मार चुके हैं? अगर ऐसा है एक eventloop साथ एक धागा QThread::quit()
कॉल करने के लिए eventloop बाहर निकलने के लिए इससे पहले कि आप QThread::wait()
फोन तुम भी शून्य QApplication::qAddPostRoutine (QtCleanUpFunction ptr)
उपयोग कर सकते हैं कुछ विशेष सफाई कार्य करना न भूलें।
उन संदेशों को डीबग करने के लिए आप QtMsgHandler qInstallMsgHandler (QtMsgHandler h)
का उपयोग कर सकते हैं और उन चेतावनियों को कैप्चर करने के लिए अपना स्वयं का संदेश हैंडलर लिख सकते हैं। यदि आप समस्या का अनुकरण कर सकते हैं तो आप संदेश पर ब्रेकपॉइंट सेट कर सकते हैं और उस स्टैक पर देख सकते हैं जहां से संदेश आ रहा है।
void debugMessageHandler(QtMsgType type, const char *msg){
if(QString(msg).contains("The message you can see in the console")){
int breakPointOnThisLine(0);
}
switch (type) {
case QtDebugMsg:
fprintf(stderr, "Debug: %s\n", msg);
break;
case QtWarningMsg:
fprintf(stderr, "Warning: %s\n", msg);
break;
case QtFatalMsg:
fprintf(stderr, "Fatal: %s\n", msg);
abort();
}
}
आपको सांत्वना करीब संकेत को पकड़ने और आवेदन उदाहरण के लिए QCoreApplication::exit()
कॉल कर सकते हैं नाशक और बच्चों के माता-पिता का रिश्ता जहाज के साथ साफ करने के लिए है।
#include <csignal>
#include <QtCore/QCoreApplication>
using namespace std;
struct CleanExit{
CleanExit() {
signal(SIGINT, &CleanExit::exitQt);
signal(SIGTERM, &CleanExit::exitQt);
signal(SIGBREAK, &CleanExit::exitQt) ;
}
static void exitQt(int sig) {
QCoreApplication::exit(0);
}
};
int main(int argc, char *argv[])
{
CleanExit cleanExit;
QCoreApplication a(argc, argv);
return a.exec();
}
लगभग पूरा हो गया।एक बार जब आप बाहर निकलेंगे (0) आपको अपने क्यूटी विशिष्ट क्लीनअप कोड को कहीं कहीं करना है जो सिग्नल हैंडलर ExitQt() में नहीं है। इसलिए आपको अपने क्यूटी क्लीनअप कोड को टॉक्यूइट() सिग्नल में जोड़ना होगा। qT-> निकास (0) को बुलाए जाने के बाद लगभग टूकुइट सिग्नल केवल उत्सर्जित होता है। –
सी ++ 11 इसे और अधिक आसान बनाता है: 'सिग्नल (SIGTERM, [] (int sig) {qApp-> छोड़ें();}); ' – ManuelSchneid3r
यह पूरी तरह से काम नहीं कर रहा है। मैंने क्लीनअप से संबंधित वस्तु को क्यूप्लिकेशंस का एक बच्चा बना दिया है। खिड़की सामान्य रूप से बंद होने पर विनाशक को ठीक से बुलाया जाता है। लेकिन सिस्टम शट डाउन/लॉगआउट पर, क्यूप्लिकेशन बाल विनाशक को कभी नहीं कहा जाता है। – galinette