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 }