#include #include #include #include #include #include #include #include #include #include #include #include using namespace Cntm; using namespace std; static void DoError() { cerr << "������!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl; exit(1); } // Test1 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// static int GCnt = 0; class Test12Help: public SynchroRefBase { public: ~Test12Help() { QApplication::exit(); } }; class Test12: public ActiveRefBaseEx { public: typedef RefPtr Ptr; static const int TC = 100; ActiveThreadHandle Hdl[TC]; ~Test12() { GCnt++; } void OnReleaseInstance() { GCnt++; Ptr p; ReanimateInstance(&p); } void Thread1(int& h, const Test12Help::Ptr& s) { while (true) { ActiveThread::CheckTerminating(); sched_yield(); } } void Exec() { Test12Help::Ptr p(new Test12Help); for (int i = 0; i < TC; i++) Hdl[i] = StartThread(&Test12::Thread1)(i, p); sleep(1); for (int i = 0; i < TC; i++) Hdl[i].Terminate(); for (int i = 0; i < TC; i++) Hdl[i].Unassign(); p.SetNull(); qApp->exec(); // ����, ����� ������ ���������� } void CheckCompile() { if (false) { ActiveThread::Start(this, &Test12::Thread1)(1, Test12Help::Ptr()); ActiveThread::Start(Ptr(*this), &Test12::Thread1)(1, Test12Help::Ptr()); ActiveThread::Start(*this, &Test12::Thread1)(1, Test12Help::Ptr()); } } }; static void Test1Exp() { GCnt = 0; cerr << "1 ���� �������� ��������" << endl; Test12::Ptr t1(new Test12); t1->CheckCompile(); t1->Exec(); t1.SetNull(); RefBaseEx::WaitDestroyAll(); if (GCnt != 2) DoError(); } // Test2 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class Test22: public ActiveSynchroRefBaseEx { public: typedef RefPtr Ptr; static const int TC = 100; ~Test22() { GCnt++; QApplication::exit(); } void OnReleaseInstance() { if (GCnt < 5) { GCnt++; cerr << "OnReleaseInstance " << GCnt << endl; Ptr p; ReanimateInstance(&p, true); if (GCnt < 3) sleep(1); Exec(); } } void Thread1(int& h, const string& s) { while (true) { UsingSync use(*this); sched_yield(); use.Unuse(); sleep(1); } } void Exec() { for (int i = 0; i < TC; i++) StartThread(&Test22::Thread1)(i, "k"); } }; static void Test2Exp() { GCnt = 0; cerr << "2 ���� �������� ��������" << endl; Test22::Ptr t1(new Test22); t1->Exec(); sleep(1); t1.SetNull(); qApp->exec(); // ����, ����� ������ ���������� if (GCnt != 6) DoError(); } void ActiveObjectExp() { cerr << endl << "���� �������� �������� ==================================================" << endl; Test1Exp(); Test2Exp(); cerr << "����� ����� �������� ��������" << endl; }