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


    关于信号和槽有一个非常精炼的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的使用方法如下所示:

    [cpp] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #include "sigslot.h"    
    2. #include <string>    
    3. #include <stdio.h>    
    4. #include <iostream>    
    5. #include <windows.h>    
    6.     
    7. using namespace sigslot;      
    8.     
    9. using namespace std;    
    10.     
    11. class CSender    
    12. {    
    13. public:    
    14.     sigslot::signal2<string, int> m_pfnsigDanger;    
    15.     
    16.     void Panic()    
    17.     {    
    18.         static int nVal = 0;    
    19.         char szVal[20] = { 0 };    
    20.         sprintf_s(szVal,20, "help--%d", nVal);    
    21.         m_pfnsigDanger(szVal, nVal++);    
    22.     }    
    23. };    
    24.     
    25. class CReceiver :public sigslot::has_slots<>    
    26. {    
    27. public:    
    28.     void OnDanger(string strMsg, int nVal)    
    29.     {    
    30.         //printf("%s ==> %d", strMsg.c_str(), nVal);    
    31.         cout << strMsg.c_str() << " ==> " << nVal << endl;    
    32.     }    
    33. };    
    34.         
    35. int main()    
    36. {    
    37.     CSender sender;    
    38.     CReceiver recever;    
    39.     
    40.     cout << "create object ok..." << endl;    
    41.     
    42.     sender.m_pfnsigDanger.connect(&recever, &CReceiver::OnDanger);    
    43.     
    44.     cout << "connect succ!" << endl;    
    45.     
    46.     while (1)    
    47.     {    
    48.         cout << "in while..." << endl;    
    49.     
    50.         sender.Panic();    
    51.         Sleep(2000);    
    52.     
    53.         cout << "end of sleep" << endl;    
    54.     }    
    55.     
    56.     
    57.     return 0;    
    58. }    

    需要注意的是,如果在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

  • 相关阅读:
    第五周学习进度
    第四周学习进度
    四则运算三
    第三周学习进度
    软件工程个人作业—四则运算2
    软件工程个人作业01
    软件工程概论—用户登录界面
    构建之法读书笔记06
    构建之法读书笔记05
    构建之法读书笔记04
  • 原文地址:https://www.cnblogs.com/findumars/p/5625061.html
Copyright © 2020-2023  润新知