qt有自己的线程实现方式,但有时候我们由于某些原因,会用到pthread来实现多线程。

我把自己看到过的pthread使用方法记下来。如果你有更好的方法,或觉得此方法有什么缺点,请在评论区指出。

这个类去掉了一些冗余代码,编译时可能出现小错误。

 

CRecvJson.cpp

 1 #include "ReceiveJson.h"
 2 #include<sys/time.h>
 3 #include<unistd.h>
 4 
 5 void sleep_ms(unsigned int secs)
 6 {
 7     struct timeval tval;
 8     tval.tv_sec = secs / 1000;
 9     tval.tv_usec = (secs * 1000) % 1000000;
10     select(0, NULL, NULL, NULL, &tval);
11 }
12 
13 unsigned long TimeElapseUs(timeval& start, timeval& end)
14 {
15     unsigned long un1 = 1000000*(end.tv_sec - start.tv_sec);
16     unsigned long un2 = (end.tv_usec - start.tv_usec);
17     unsigned long diff = un1 + un2;
18 
19     return diff;
20 }
21 
22 CReceiveJson::CReceiveJson(void)
23 {
24 }
25 
26 
27 CReceiveJson::~CReceiveJson(void)
28 {
29 }
30 
31 void CReceiveJson::PushJsonData(char* pRecv, int nRecvLen)
32 {
33     char* pRecvData = new char[nRecvLen + 1];
34     memset(pRecvData, 0, nRecvLen + 1);
35     memcpy(pRecvData, pRecv, nRecvLen);
36 
37     m_lock.Lock();    
38     m_dequeJson.push_front(pRecvData);
39     m_lock.UnLock();
40 }
41 
42 void CReceiveJson::InitRecvThd()
43 {
44     m_bRecvRunning = true;
45     int nRet = pthread_create(&m_recvThdId, NULL, RecieveThd, this);
46     if(nRet == 0)
47     {
48 
49     }
50 }
51 
52 void CReceiveJson::UnInitParaseThd()
53 {
54     m_bRecvRunning = false;
55 }
56 
57 void *CReceiveJson::RecieveThd(void* lParam)
58 {
59     CReceiveJson* pThis = (CReceiveJson*)lParam;
60     pThis->DoRecieve();
61 
62     return NULL;
63 }
64 
65 void CReceiveJson::DoRecieve()
66 {
67     while(m_bRecvRunning)
68     {
69         if (m_dequeJson.size() > 0)
70         {
71             m_lock.Lock();
72             char* pRecieve = m_dequeJson.back();
73 
74             PopJsonData();
75             m_lock.UnLock();
76         }
77 
78         sleep_ms(ThdSleepTime);
79     }
80 
81     pthread_detach(m_recvThdId);
82 }
83 
84 void CReceiveJson::PopJsonData()
85 {
86     char* p = m_dequeJson.back();
87     delete[] p;
88     p = NULL;
89     m_dequeJson.pop_back();
90 }
View Code

相关文章: