|
@@ -5,8 +5,9 @@
|
|
|
|
|
|
|
|
|
|
|
|
-procsm_if_readthread::procsm_if_readthread(procsm *pPSM,SMCallBack pCall,const char * strsmname)
|
|
|
+procsm_if_readthread::procsm_if_readthread(procsm *pPSM,SMCallBack pCall,const char * strsmname,void * pparent)
|
|
|
{
|
|
|
+ mpparent = pparent;
|
|
|
mpPSM = pPSM;
|
|
|
mpCall = pCall;
|
|
|
strncpy(mstrsmname,strsmname,255);
|
|
@@ -22,8 +23,9 @@ procsm_if_readthread::procsm_if_readthread(procsm *pPSM,SMCallBack pCall,const c
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-procsm_if_readthread::procsm_if_readthread(procsm *pPSM,ModuleFun xFun,const char * strsmname)
|
|
|
+procsm_if_readthread::procsm_if_readthread(procsm *pPSM,ModuleFun xFun,const char * strsmname,void * pparent)
|
|
|
{
|
|
|
+ mpparent = pparent;
|
|
|
mpPSM = pPSM;
|
|
|
mFun = xFun;
|
|
|
strncpy(mstrsmname,strsmname,255);
|
|
@@ -134,9 +136,15 @@ void procsm_if_readthread::run()
|
|
|
msleep(1);
|
|
|
#endif
|
|
|
#else
|
|
|
- mWaitMutex.lock();
|
|
|
- mwc.wait(&mWaitMutex,100);
|
|
|
- mWaitMutex.unlock();
|
|
|
+ procsm_if * mpif = (procsm_if * )mpparent;
|
|
|
+ if(mpif->WaitNotify()<0)
|
|
|
+ {
|
|
|
+ std::cout<<"Wait Notify Error. Please Check. "<<std::endl;
|
|
|
+ std::this_thread::sleep_for(std::chrono::milliseconds(10));
|
|
|
+ }
|
|
|
+// mWaitMutex.lock();
|
|
|
+// mwc.wait(&mWaitMutex,100);
|
|
|
+// mWaitMutex.unlock();
|
|
|
#endif
|
|
|
}
|
|
|
else
|
|
@@ -309,13 +317,13 @@ int procsm_if::listenmsg(SMCallBack pCall)
|
|
|
// return 0;
|
|
|
//#endif
|
|
|
if(mnType == procsm::ModeWrite)return -1; //listening.
|
|
|
- mpReadThread = new procsm_if_readthread(mpPSM,pCall,mstrsmname);
|
|
|
+ mpReadThread = new procsm_if_readthread(mpPSM,pCall,mstrsmname,this);
|
|
|
// mpReadThread->setPriority(QThread::TimeCriticalPriority);
|
|
|
// mpReadThread->start();
|
|
|
mpReadThread->start(QThread::HighestPriority);
|
|
|
|
|
|
#ifdef USE_GROUPUDP
|
|
|
- mpthread = new std::thread(&procsm_if::ThreadGroupRecv,this);
|
|
|
+// mpthread = new std::thread(&procsm_if::ThreadGroupRecv,this);
|
|
|
|
|
|
#endif
|
|
|
// mnType = 1;
|
|
@@ -333,13 +341,13 @@ int procsm_if::listenmsg(ModuleFun xFun)
|
|
|
// return 0;
|
|
|
//#endif
|
|
|
if(mnType == procsm::ModeWrite)return -1; //listening.
|
|
|
- mpReadThread = new procsm_if_readthread(mpPSM,xFun,mstrsmname);
|
|
|
+ mpReadThread = new procsm_if_readthread(mpPSM,xFun,mstrsmname,this);
|
|
|
// mpReadThread->setPriority(QThread::TimeCriticalPriority);
|
|
|
// mpReadThread->start();
|
|
|
mpReadThread->start(QThread::HighestPriority);
|
|
|
|
|
|
#ifdef USE_GROUPUDP
|
|
|
- mpthread = new std::thread(&procsm_if::ThreadGroupRecv,this);
|
|
|
+// mpthread = new std::thread(&procsm_if::ThreadGroupRecv,this);
|
|
|
|
|
|
#endif
|
|
|
// mnType = 1;
|
|
@@ -441,7 +449,54 @@ void procsm_if::InitSock()
|
|
|
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * @brief procsm_if::WaitNotify
|
|
|
+ * @param timeout_ms
|
|
|
+ * @return if have notify return 1,otherwise,return 0
|
|
|
+ */
|
|
|
+int procsm_if::WaitNotify(int timeout_ms)
|
|
|
+{
|
|
|
+ int nrtn = 0;
|
|
|
+ struct pollfd fds;
|
|
|
+ fds.fd = listen_fd_;
|
|
|
+ fds.events = POLLIN;
|
|
|
+ int ready_num = poll(&fds, 1, timeout_ms);
|
|
|
+ if (ready_num > 0) {
|
|
|
+ char buf[32] = {0}; // larger than ReadableInfo::kSize
|
|
|
+ ssize_t nbytes = recvfrom(listen_fd_, buf, 32, 0, nullptr, nullptr);
|
|
|
+ if (nbytes == -1) {
|
|
|
+ std::cout << "fail to recvfrom, " << strerror(errno);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ if(nbytes == 8)
|
|
|
+ {
|
|
|
+// std::cout<<"recv key."<<std::endl;
|
|
|
+ qint64 * pkey = (qint64 *)buf;
|
|
|
+ if(*pkey == mKey)
|
|
|
+ {
|
|
|
+ return 1;
|
|
|
+// mpReadThread->WakeRead();
|
|
|
+ //Waaa;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+// std::cout<<"key error"<<std::endl;
|
|
|
+ }
|
|
|
+ }
|
|
|
+// return info->DeserializeFrom(buf, nbytes);
|
|
|
+ } else if (ready_num == 0) {
|
|
|
+ return 0;
|
|
|
+ } else {
|
|
|
+ nrtn = -2;
|
|
|
+ if (errno == EINTR) {
|
|
|
+ std::cout << "poll was interrupted."<<std::endl;
|
|
|
+ } else {
|
|
|
+ std::cout << "fail to poll, " << strerror(errno);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ return nrtn;
|
|
|
+}
|
|
|
|
|
|
void procsm_if::ThreadGroupRecv()
|
|
|
{
|