forked from QuantBox/QuantBox_XAPI
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMsgQueue.cpp
107 lines (93 loc) · 1.87 KB
/
MsgQueue.cpp
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "stdafx.h"
#include "MsgQueue.h"
//#include <stdlib.h>
//#include <crtdbg.h> // For _CrtSetReportMode
//
//void myInvalidParameterHandler(const wchar_t* expression,
// const wchar_t* function,
// const wchar_t* file,
// unsigned int line,
// uintptr_t pReserved)
//{
// wprintf(L"Invalid parameter detected in function %s."
// L" File: %s Line: %d\n", function, file, line);
// wprintf(L"Expression: %s\n", expression);
// abort();
//}
CMsgQueue::CMsgQueue():m_queue(1024)
{
m_hThread = nullptr;
m_bRunning = false;
//回调函数地址指针
m_fnOnRespone = nullptr;
//_invalid_parameter_handler oldHandler, newHandler;
//newHandler = myInvalidParameterHandler;
//oldHandler = _set_invalid_parameter_handler(newHandler);
//_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
}
void CMsgQueue::Clear()
{
ResponeItem* pItem = nullptr;
//清空队列
while (m_queue.try_dequeue(pItem))
{
delete pItem->ptr1;
delete pItem->ptr2;
delete pItem->ptr3;
delete pItem;
}
}
bool CMsgQueue::Process()
{
ResponeItem* pItem = nullptr;
if (m_queue.try_dequeue(pItem))
{
Output(pItem);
delete pItem->ptr1;
delete pItem->ptr2;
delete pItem->ptr3;
delete pItem;
return true;
}
return false;
}
void CMsgQueue::StartThread()
{
if(nullptr == m_hThread)
{
m_bRunning = true;
m_hThread = new thread(ProcessThread,this);
}
}
void CMsgQueue::StopThread()
{
//m_mtx.lock();
m_bRunning = false;
lock_guard<mutex> cl(m_mtx);
if(m_hThread)
{
m_hThread->join();
delete m_hThread;
m_hThread = nullptr;
}
//m_mtx.unlock();
}
void CMsgQueue::RunInThread()
{
while (m_bRunning)
{
if (Process())
{
}
else
{
//挂起,等事件到来
//m_mtx.lock();
this_thread::sleep_for(chrono::milliseconds(1));
}
}
lock_guard<mutex> cl(m_mtx);
// 清理线程
m_hThread = nullptr;
m_bRunning = false;
}