关于信号和槽有一个非常精炼的C++实现,作者是Sarah Thompson,该实现只有一个头文件sigslot.h,跨平台且线程安全。

源码在:http://sigslot.cvs.sourceforge.net/viewvc/sigslot/sigslot/sigslot.h?revision=1.1.1.1&content-type=text%2Fplain

在WebRTC中,sigslot .h是其基础的事件处理框架, 在多个模块的消息通知,响应处理中被使用。

sigslot.h的使用方法如下所示:

  1. #include "sigslot.h"
  2. #include <string>
  3. #include <stdio.h>
  4. #include <iostream>
  5. #include <windows.h>
  6. using namespace sigslot;
  7. using namespace std;
  8. class CSender
  9. {
  10. public:
  11. sigslot::signal2<string, int> m_pfnsigDanger;
  12. void Panic()
  13. {
  14. static int nVal = 0;
  15. char szVal[20] = { 0 };
  16. sprintf_s(szVal,20, "help--%d", nVal);
  17. m_pfnsigDanger(szVal, nVal++);
  18. }
  19. };
  20. class CReceiver :public sigslot::has_slots<>
  21. {
  22. public:
  23. void OnDanger(string strMsg, int nVal)
  24. {
  25. //printf("%s ==> %d", strMsg.c_str(), nVal);
  26. cout << strMsg.c_str() << " ==> " << nVal << endl;
  27. }
  28. };
  29. int main()
  30. {
  31. CSender sender;
  32. CReceiver recever;
  33. cout << "create object ok..." << endl;
  34. sender.m_pfnsigDanger.connect(&recever, &CReceiver::OnDanger);
  35. cout << "connect succ!" << endl;
  36. while (1)
  37. {
  38. cout << "in while..." << endl;
  39. sender.Panic();
  40. Sleep(2000);
  41. cout << "end of sleep" << endl;
  42. }
  43. return 0;
  44. }

需要注意的是,如果在Qt工程中使用sigslot.h,sigslot.h中的emit函数名会和Qt中的emit宏冲突,修改方法有两个,一是将sigslot.h的emit改成其他名字,二是在.pro文件中添加DEFINES+=QT_NO_EMIT,禁用Qt的emit宏。

参考链接:http://blog.csdn.net/u014338577/article/details/47127405

http://blog.csdn.net/caoshangpa/article/details/54088313

04-01 23:14