找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4856|回复: 2

ACE包自带例程的运行问题

[复制链接]
发表于 2007-12-11 22:03:14 | 显示全部楼层 |阅读模式
最近在学习ACE的线程管理部分,ACE-5.5\ACE_wrappers\examples\APG\ThreadManagement里Signals_vc8.vcproj程序的运行结果怎么会是这样啊?
(1936) Starting thread
(3396) Starting thread
(2664) Starting thread
(2108) Starting thread
(3012) Starting thread
好象信号没有发到。可是程序里明明发啊。
 楼主| 发表于 2007-12-11 22:03:22 | 显示全部楼层
程序如下:
  1. // Signals.cpp,v 1.6 2005/12/30 11:02:02 jwillemsen Exp
  2. #include "ace/config-lite.h"
  3. #if defined (ACE_HAS_THREADS)
  4. #include "ace/OS_NS_time.h"
  5. #include "ace/OS_NS_unistd.h"
  6. #include "ace/Task.h"
  7. #include "ace/Log_Msg.h"
  8. #include "ace/Signal.h"
  9. // Listing 1 code/ch13
  10. class SignalableTask : public ACE_Task<ACE_MT_SYNCH>
  11. {
  12. public:
  13.   virtual int handle_signal (int signum,
  14.                              siginfo_t *  = 0,
  15.                              ucontext_t * = 0)
  16.   {
  17.     if (signum == SIGUSR1)
  18.       {
  19.         ACE_DEBUG ((LM_DEBUG,
  20.                     ACE_TEXT ("(%t) received a %S signal\n"),
  21.                     signum));
  22.         handle_alert ();
  23.       }
  24.     return 0;
  25.   }
  26.   virtual int svc (void)
  27.   {
  28.     ACE_DEBUG ((LM_DEBUG, ACE_TEXT ("(%t) Starting thread\n")));
  29.     while (1)
  30.       {
  31.         ACE_Message_Block* mb = 0;
  32.         ACE_Time_Value tv (0, 1000);
  33.         tv += ACE_OS::time (0);
  34.         int result = this->getq (mb, &tv);
  35.         if (result == -1 && errno == EWOULDBLOCK)
  36.           continue;
  37.         else
  38.           process_message (mb);
  39.       }
  40.       ACE_NOTREACHED (return 0);
  41.     }
  42.   void handle_alert ();
  43.   void process_message (ACE_Message_Block *mb);
  44. };
  45. // Listing 1
  46. void
  47. SignalableTask::process_message (ACE_Message_Block *)
  48. {
  49. }
  50. void
  51. SignalableTask::handle_alert ()
  52. {
  53. }
  54. // Listing 2 code/ch13
  55. int ACE_TMAIN (int, ACE_TCHAR *[])
  56. {
  57.   SignalableTask handler;
  58.   handler.activate (THR_NEW_LWP | THR_JOINABLE , 5);
  59.   ACE_Sig_Handler sh;
  60.   sh.register_handler (SIGUSR1, &handler);
  61.   ACE_OS::sleep (1);
  62.   ACE_Thread_Manager::instance () ->
  63.     kill_grp (handler.grp_id (), SIGUSR1);
  64.   handler.wait ();
  65.   return 0;
  66. }
  67. // Listing 2
  68. #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)
  69. template class ACE_Task<ACE_MT_SYNCH>;
  70. #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)
  71. pragma instantiate ACE_Task<ACE_MT_SYNCH>;
  72. #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */
  73. #else
  74. #include "ace/OS_main.h"
  75. #include "ace/OS_NS_stdio.h"
  76. int ACE_TMAIN (int, ACE_TCHAR *[])
  77. {
  78.   ACE_OS::puts (ACE_TEXT ("This example requires threads."));
  79.   return 0;
  80. }
  81. #endif /* ACE_HAS_THREADS */
复制代码

[ 本帖最后由 peakzhang 于 2007-12-11 22:18 编辑 ]
 楼主| 发表于 2007-12-11 22:03:33 | 显示全部楼层
信号好像是Unix下比较常用,windows下 ACE_Thread_Manager::instance () ->kill_grp (handler.grp_id (), SIGUSR1);这个没有被实现,所以返回值是-1.

楼主还是试试用消息吧,ACE_Message_Block.
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-23 19:26 , Processed in 0.011867 second(s), 5 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表