Skip to content

Commit

Permalink
[fix] #24 sigslot can not define static
Browse files Browse the repository at this point in the history
  • Loading branch information
itas109 committed Apr 11, 2020
1 parent 4c21b89 commit fb0aa5e
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 23 deletions.
20 changes: 12 additions & 8 deletions src/SerialPortUnixBase.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
#include "SerialPortUnixBase.h"

sigslot::signal0<> CSerialPortUnixBase::readReady;//sigslot
bool CSerialPortUnixBase::isThreadRunning = false;

CSerialPortUnixBase::CSerialPortUnixBase()
{
construct();
Expand All @@ -29,6 +26,8 @@ void CSerialPortUnixBase::construct()
m_flowControl = itas109::FlowNone;
m_readBufferSize = 512;

m_isThreadRunning = false;

m_operateMode = itas109::AsynchronousOperate;

pthread_mutex_init(&m_communicationMutex,NULL);
Expand Down Expand Up @@ -233,15 +232,15 @@ void *CSerialPortUnixBase::commThreadMonitor(void *pParam)

if(p_base)
{
while (isThreadRunning)
while (p_base->isThreadRunning())
{
int readbytes = 0;

//read前获取可读的字节数,不区分阻塞和非阻塞
ioctl(p_base->fd, FIONREAD, &readbytes);
if (readbytes >= p_base->m_minByteReadNoify) //设定字符数,默认为2
{
readReady._emit();
p_base->readReady._emit();
}
}
}
Expand Down Expand Up @@ -271,7 +270,7 @@ bool CSerialPortUnixBase::startThreadMonitor()

bool CSerialPortUnixBase::stopThreadMonitor()
{
isThreadRunning = false;
m_isThreadRunning = false;

pthread_join( m_monitorThread, NULL );

Expand Down Expand Up @@ -304,12 +303,12 @@ bool CSerialPortUnixBase::openPort()
}
else
{
isThreadRunning = true;
m_isThreadRunning = true;
bRet = startThreadMonitor();

if (!bRet)
{
isThreadRunning = false;
m_isThreadRunning = false;
lastError = itas109::/*SerialPortError::*/SystemError;
}
}
Expand Down Expand Up @@ -540,6 +539,11 @@ std::string CSerialPortUnixBase::getVersion()
return m_version;
}

bool CSerialPortUnixBase::isThreadRunning()
{
return m_isThreadRunning;
}

void CSerialPortUnixBase::lock()
{
pthread_mutex_lock(&m_communicationMutex);
Expand Down
13 changes: 11 additions & 2 deletions src/SerialPortUnixBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,15 @@ class CSerialPortUnixBase : public CSerialPortBase
*/
std::string getVersion();

public:
/**
* @brief isThreadRunning 是否启动多线程
* @return
* @retval true thread running 多线程已启动
* @retval false thread not running 多线程未启动
*/
bool isThreadRunning();

private:
/**
* @brief lock 锁
Expand Down Expand Up @@ -382,7 +391,7 @@ class CSerialPortUnixBase : public CSerialPortBase
bool stopThreadMonitor();

public:
static sigslot::signal0<> readReady;///< sigslot for read 读数据信号
sigslot::signal0<> readReady;///< sigslot for read 读数据信号

private:
std::string m_portName;
Expand All @@ -398,7 +407,7 @@ class CSerialPortUnixBase : public CSerialPortBase
private:
pthread_t m_monitorThread; /**< read thread */

static bool isThreadRunning;
bool m_isThreadRunning;

pthread_mutex_t m_communicationMutex;///< mutex
};
Expand Down
20 changes: 11 additions & 9 deletions src/SerialPortWinBase.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,6 @@

#include <iostream>

sigslot::signal0<> CSerialPortWinBase::readReady;//sigslot
bool CSerialPortWinBase::isThreadRunning = false;

CSerialPortWinBase::CSerialPortWinBase()
{
construct();
Expand Down Expand Up @@ -45,7 +42,7 @@ void CSerialPortWinBase::construct()
overlapMonitor.OffsetHigh = 0;
overlapMonitor.hEvent = CreateEvent(NULL, true, false, NULL);

isThreadRunning = true;
m_isThreadRunning = false;

InitializeCriticalSection(&m_communicationMutex);
}
Expand Down Expand Up @@ -160,12 +157,12 @@ bool CSerialPortWinBase::openPort()
//set comm event
if (SetCommMask(m_handle, EV_TXEMPTY | EV_RXCHAR | EV_DSR)) // @todo mask need modify
{
isThreadRunning = true;
m_isThreadRunning = true;
bRet = startThreadMonitor();

if (!bRet)
{
isThreadRunning = false;
m_isThreadRunning = false;
lastError = itas109::/*SerialPortError::*/SystemError;
}
}
Expand Down Expand Up @@ -279,7 +276,7 @@ unsigned int __stdcall CSerialPortWinBase::commThreadMonitor(LPVOID pParam)

ResetEvent(m_mainHandle);

while (isThreadRunning)
while (p_base->isThreadRunning())
{
if (!WaitCommEvent(m_mainHandle, &eventMask, &m_overlapMonitor))
if (GetLastError() != ERROR_IO_PENDING)
Expand All @@ -306,7 +303,7 @@ unsigned int __stdcall CSerialPortWinBase::commThreadMonitor(LPVOID pParam)
ClearCommError(m_mainHandle, &dwError, &comstat);
if (comstat.cbInQue >= p_base->m_minByteReadNoify) //设定字符数,默认为2
{
readReady._emit();
p_base->readReady._emit();
}
}

Expand Down Expand Up @@ -857,6 +854,11 @@ HANDLE CSerialPortWinBase::getMainHandle()
return m_handle;
}

bool CSerialPortWinBase::isThreadRunning()
{
return m_isThreadRunning;
}

void CSerialPortWinBase::lock()
{
//Finished
Expand Down Expand Up @@ -894,7 +896,7 @@ bool CSerialPortWinBase::stopThreadMonitor()
//Finished

SetCommMask(m_monitorThread, 0);
isThreadRunning = false;
m_isThreadRunning = false;
//_endthreadex(0);//not recommend

return true;
Expand Down
16 changes: 12 additions & 4 deletions src/SerialPortWinBase.h
Original file line number Diff line number Diff line change
Expand Up @@ -314,6 +314,14 @@ class CSerialPortWinBase : public CSerialPortBase
*/
HANDLE getMainHandle();

/**
* @brief isThreadRunning 是否启动多线程
* @return
* @retval true thread running 多线程已启动
* @retval false thread not running 多线程未启动
*/
bool isThreadRunning();

protected:
/**
* @brief lock 锁
Expand All @@ -331,7 +339,7 @@ class CSerialPortWinBase : public CSerialPortBase
* @brief thread monitor 多线程监视器
*
*/
static unsigned int __stdcall commThreadMonitor(LPVOID pParam);
static unsigned int __stdcall commThreadMonitor(LPVOID pParam);
/**
* @brief start thread monitor 启动多线程监视器
*
Expand All @@ -350,15 +358,15 @@ class CSerialPortWinBase : public CSerialPortBase
bool stopThreadMonitor();

public:
static sigslot::signal0<> readReady;///< sigslot for read 读数据信号
sigslot::signal0<> readReady;///< sigslot for read 读数据信号

private:
std::string m_portName;
int m_baudRate;
itas109::Parity m_parity;
itas109::DataBits m_dataBits;
itas109::StopBits m_stopbits;
enum itas109::FlowControl m_flowControl;
enum itas109::FlowControl m_flowControl;
int64 m_readBufferSize;

private:
Expand All @@ -375,6 +383,6 @@ class CSerialPortWinBase : public CSerialPortBase

CRITICAL_SECTION m_communicationMutex;///< mutex

static bool isThreadRunning;
bool m_isThreadRunning;
};
#endif //__CSERIALPORTWINBASE_H__

0 comments on commit fb0aa5e

Please sign in to comment.