سؤال

لدي وحدة تحكم QCoreApplication التي لديها توقيت واتصالات المقبس وتستخدم أيضا mutex مغلقة.

عندما أغلق التطبيق يدويا، فإنه يعطي خطأ يقول إن بعض Mutex مؤمن وتم توقيعه. هل هناك أي طريقة يمكنني القيام بها في تطبيق وحدة التحكم عند إغلاق المستخدم؟

هل كانت مفيدة؟

المحلول

يجب معالجة التنظيف من قبل المدمرين وعلاقة الوالدين للأطفال.

اجعل كائن سيدك (الواحد في الرئيسي) طفل من Qapplication بحيث يتم تدميره بكل أطفاله قبل qapplication هو.

هل أنت متأكد أنك قتلت كل المواضيع الخاصة بك؟ إذا كان مؤشر ترابط مع EventLoop تأكد من الاتصال QThread::quit() للخروج من EveSloop قبل الاتصال 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();
}

نصائح أخرى

اتضح أن تطبيق سطر الأوامر الختامي (تم تحديده على Win7 & VS2010) عن طريق الضغط على زر "إغلاق" (زر X أحمر على شريط العنوان) يمر STATUS_CONTROL_C_EXIT إشارة إلى التطبيق. يتم إحباط جميع المواضيع مع هذا الرمز.

خرج الخيط الرئيسي "(0x980) برمز -1073741510 (0xc000013a).

خرج مؤشر الصفحات "Qthread" (0x2388) برمز -1073741510 (0xc000013a).

وهذا يعني أنه لا توجد وسيلة لاعتراض هذا مع QCoreApplication::aboutToQuit() الإشارة.

إلقاء نظرة على winnt.h أو ntstatus.h. وبعد هذه هي القيمة المخصصة للبيان الثابت STATUS_CONTROL_C_EXIT. وبعد يمثل وقت التشغيل فقط لإنهاء برنامجك برمز لاحظ تشغيل عملية إلغاء المستخدم.

يمكنك الاتصال qcoreapplication :: about toquit. إشارة والقيام بالتنظيف اللازم هناك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top