test_end_event_loop.cpp
来自「ACE自适配通信环境(ADAPTIVE Communication Enviro」· C++ 代码 · 共 175 行
CPP
175 行
// test_end_event_loop.cpp,v 1.7 2004/05/05 18:59:34 shuston Exp// ============================================================================//// = FILENAME// test_end_event_loop.cpp//// = DESCRITPTION// This program tests the event loop mechanism of the// Proactor. To end the event loop, threads that are blocked in// waiting for completions are woken up and the event loop comes// to the end. This is tested in this program.//// Threads are doing <run_event_loop> with/without time_out// values and the main thread calls <end_event_loop>.//// = COMPILATION// make//// = RUN// ./test_end_event_loop//// = AUTHOR// Alexander Babu Arulanthu <alex@cs.wustl.edu>//// =====================================================================#include "ace/OS_NS_unistd.h"#include "ace/Proactor.h"#include "ace/Task.h"#include "ace/WIN32_Proactor.h"#include "ace/POSIX_Proactor.h"#include "ace/OS_main.h"#if ((defined (ACE_WIN32) && !defined (ACE_HAS_WINCE)) || \ (defined (ACE_HAS_AIO_CALLS)) && !defined (ACE_POSIX_AIOCB_PROACTOR))// This only works on Win32 platforms and on Unix platforms supporting// POSIX aio calls.class My_Task: public ACE_Task <ACE_NULL_SYNCH>{ // = TITLE // // Contains thread functions which execute event loops. Each // thread waits for a different signal. //public: // Constructor. My_Task (void) : time_flag_ (0) {} virtual ~My_Task (void) {} // Destructor. // If time_flag is zero do the eventloop indefinitely, otherwise do // it for finite amount of time (13secs!!!). int open (void *timed_event_loop) { // Set the local variable. if (timed_event_loop == 0) this->time_flag_ = 0; else this->time_flag_ = 1; // Spawn the threads. if (this->activate (THR_NEW_LWP, 5) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%N:%l:%p\n", "My_Task:open: <activate> failed"), -1); return 0; } // Thread function. int svc (void) { ACE_DEBUG ((LM_DEBUG, "(%P|%t):Starting svc routine\n")); if (this->time_flag_) { ACE_DEBUG ((LM_DEBUG, "(%P|%t):Going to do *timed* <run_event_loop> \n")); ACE_Time_Value run_time (13); if (ACE_Proactor::instance ()->run_event_loop (run_time) == -1) ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t):%p.\n", "<Proactor::run_event_loop> failed"), -1); } else { ACE_DEBUG ((LM_DEBUG, "(%P|%t):Going to do *indefinite* <run_event_loop> \n")); if (ACE_Proactor::instance ()->run_event_loop () == -1) ACE_ERROR_RETURN ((LM_ERROR, "(%P|%t):%p.\n", "<Proactor::run_event_loop> failed"), -1); } return 0; };private: int time_flag_; // If zero, indefinite event loop, otherwise timed event loop.};intACE_TMAIN (int argc, ACE_TCHAR *argv []){ ACE_UNUSED_ARG (argc); ACE_UNUSED_ARG (argv); ACE_DEBUG ((LM_DEBUG, "(%P | %t):Test starts \n")); // Let us get the singleton proactor created here. This is very // important. This will mask the signal used in the Proactor masked // for the main thread (and all the threads). ACE_Proactor *proactor = ACE_Proactor::instance (); ACE_UNUSED_ARG (proactor); My_Task task1, task2; // Test the indefinite run event loop. if (task1.open (0) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%N:%l:(%P | %t):Failed to <open> the task\n"), 1); // Test the indefinite run event loop. Just pass a non-zero. if (task2.open ((void *)&task2) == -1) ACE_ERROR_RETURN ((LM_ERROR, "%N:%l:(%P | %t):Failed to <open> the task\n"), 1); // Give a gap. ACE_OS::sleep (3); // End the event loop. if (ACE_Proactor::instance ()->end_event_loop () == -1) ACE_ERROR_RETURN ((LM_ERROR, "%N:%l:(%P | %t):Failed to <end_event_loop>\n"), 1); ACE_Thread_Manager::instance ()->wait (); ACE_DEBUG ((LM_DEBUG, "(%P | %t):Test ends\n")); return 0;}#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)template class ACE_Task <ACE_NULL_SYNCH>;#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)#pragma instantiate ACE_Task <ACE_NULL_SYNCH>#endif /* ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA */#else /* ACE_WIN32 && !ACE_HAS_WINCE || ACE_HAS_AIO_CALLS && !ACE_POSIX_AIOCB_PROACTOR*/intmain (int, char *[]){ ACE_DEBUG ((LM_DEBUG, "This example cannot work with AIOCB_Proactor.\n")); return 1;}#endif /* ACE_WIN32 && !ACE_HAS_WINCE || ACE_HAS_AIO_CALLS && !ACE_POSIX_AIOCB_PROACTOR*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?