forked from skyfireitdiy/sflib
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsf_msg_queue.h
86 lines (72 loc) · 1.54 KB
/
sf_msg_queue.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
/**
* @version 1.0.0
* @author skyfire
* @mail [email protected]
* @see http://github.com/skyfireitdiy/sflib
* @file sf_msg_queue.h
* sflib第一版本发布
* 版本号1.0.0
* 发布日期:2018-10-22
*/
/*
* sf_msg_queue 消息队列
*/
#pragma once
#include "sf_single_instance.hpp"
#include <functional>
#include <list>
#include <map>
#include <mutex>
#include <algorithm>
#include <condition_variable>
namespace skyfire
{
/**
* @brief 消息队列
*/
class sf_msg_queue
{
public:
SF_SINGLE_TON(sf_msg_queue);
private:
sf_msg_queue();
std::list<std::pair<void*,std::function<void()>>> func_data__;
std::mutex mu_func_data_op__;
std::mutex wait_mu__;
std::condition_variable wait_cond__;
public:
/**
* 增加消息
* @param id 对象
* @param func 要调用的函数
*/
void add_msg(void *id, std::function<void()> func);
/**
* 删除对象的所有消息
* @param id 对象
*/
void remove_msg(void *id);
/**
* 清空消息
*/
void clear();
/**
* 获取一条消息
* @return
*/
std::function<void()> take();
/**
* 判断是否队列为空
* @return 是否为空
*/
bool empty();
/**
* 等待消息到来
*/
void wait_msg();
/**
* 添加一个空消息
*/
void add_empty_msg();
};
}