#include #include #include #include #include #include #include #include #include #include "kdevexp4.h" KDevExp4 * mw; class SynExp1: public Cntm::SynchroRefBase { public: typedef Cntm::RefPtr Ptr; std::string Name; ~SynExp1(); void Thread14() { Cntm::SynchroSpace::Ptr mss = Cntm::SynchroSpace::Main(); mss->Enter(); std::cerr << "Поток Thread14: неболшая пауза 2 сек. " << Name << std::endl; sleep(1); std::cerr << "Поток Thread14: проснулся " << Name << std::endl; mss->Leave(); sleep(2); mss->Enter(); try { mw->setCaption("KDevExp4 - Thread14"); } catch (const std::exception& e) { std::cerr << "Ошибка в потоке Thread14: " << e.what() << std::endl; } mss->Leave(); mss.SetNull(); std::cerr << "Поток Thread14 засыпает на 6 сек." << std::endl; try { for (int i = 0; i < 20; i++) { Cntm::AsyncProc::CheckTerminating(); std::cerr << "-----" << i << "-----" << std::endl; sleep(1); } sleep(26); } catch(...) { std::cerr << "Потоку Thread14 было настойчиво рекомендовано завершиться" << std::endl; } std::cerr << "Поток Thread14 проснулся" << std::endl; } }; SynExp1::~SynExp1() { std::cerr << "SynExp1::~SynExp1() " << Name << std::endl; } int main(int argc, char **argv) { Cntm::QTMainSynchroSpace::Application a(argc, argv); SynExp1::Ptr se1(new SynExp1); se1->Name = "Поток14"; Cntm::AsyncProcHandle h = se1->ThreadProc(&SynExp1::Thread14)(); se1.SetNull(); mw = new KDevExp4(); mw->setCaption( "KDevExp4" ); mw->show(); a.connect( &a, SIGNAL(lastWindowClosed()), &a, SLOT(quit()) ); std::cerr << "before exec1" << std::endl; int res = a.exec(); std::cerr << "after exec1" << std::endl; h.Terminate(); std::cerr << "Перед выходом" << std::endl; a.End(); // Пока не завершится поток и не будет уничтожен объект se1 выход из End() не произойдет. std::cerr << "После выхода" << std::endl; return res; }