diff --git a/P25Gateway/P25Gateway.cpp b/P25Gateway/P25Gateway.cpp index 19a12fb..109749e 100644 --- a/P25Gateway/P25Gateway.cpp +++ b/P25Gateway/P25Gateway.cpp @@ -22,6 +22,7 @@ #include "DMRLookup.h" #include "Network.h" #include "Version.h" +#include "Thread.h" #include "Speech.h" #include "Log.h" @@ -350,13 +351,8 @@ void CP25Gateway::run() lostTimer.stop(); } - if (ms < 5U) { -#if defined(_WIN32) || defined(_WIN64) - ::Sleep(5UL); // 5ms -#else - ::usleep(5000); // 5ms -#endif - } + if (ms < 5U) + CThread::sleep(5U); } delete speech; diff --git a/P25Parrot/Makefile b/P25Parrot/Makefile index dba3740..58097e9 100644 --- a/P25Parrot/Makefile +++ b/P25Parrot/Makefile @@ -4,7 +4,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x LIBS = LDFLAGS = -g -OBJECTS = Log.o Network.o P25Parrot.o Parrot.o StopWatch.o Timer.o UDPSocket.o Utils.o +OBJECTS = Log.o Network.o P25Parrot.o Parrot.o StopWatch.o Thread.o Timer.o UDPSocket.o Utils.o all: P25Parrot diff --git a/P25Parrot/Makefile.Solaris b/P25Parrot/Makefile.Solaris index 7a46f5f..618aba0 100644 --- a/P25Parrot/Makefile.Solaris +++ b/P25Parrot/Makefile.Solaris @@ -4,7 +4,7 @@ CFLAGS = -g -O3 -Wall -std=c++0x LIBS = -lsocket LDFLAGS = -g -OBJECTS = Log.o Network.o P25Parrot.o Parrot.o StopWatch.o Timer.o UDPSocket.o Utils.o +OBJECTS = Log.o Network.o P25Parrot.o Parrot.o StopWatch.o Thread.o Timer.o UDPSocket.o Utils.o all: P25Parrot diff --git a/P25Parrot/P25Parrot.cpp b/P25Parrot/P25Parrot.cpp index d8b55b8..928ec89 100644 --- a/P25Parrot/P25Parrot.cpp +++ b/P25Parrot/P25Parrot.cpp @@ -21,6 +21,7 @@ #include "Parrot.h" #include "Network.h" #include "Version.h" +#include "Thread.h" #include "Timer.h" #include "Log.h" @@ -148,13 +149,8 @@ void CP25Parrot::run() parrot.end(); } - if (ms < 5U) { -#if defined(_WIN32) || defined(_WIN64) - ::Sleep(5UL); // 5ms -#else - ::usleep(5000); // 5ms -#endif - } + if (ms < 5U) + CThread::sleep(5U); } network.close(); diff --git a/P25Parrot/P25Parrot.vcxproj b/P25Parrot/P25Parrot.vcxproj index 39c637c..8c8b9f8 100644 --- a/P25Parrot/P25Parrot.vcxproj +++ b/P25Parrot/P25Parrot.vcxproj @@ -152,6 +152,7 @@ + @@ -163,6 +164,7 @@ + diff --git a/P25Parrot/P25Parrot.vcxproj.filters b/P25Parrot/P25Parrot.vcxproj.filters index 05b9d69..c43a201 100644 --- a/P25Parrot/P25Parrot.vcxproj.filters +++ b/P25Parrot/P25Parrot.vcxproj.filters @@ -41,6 +41,9 @@ Header Files + + Header Files + @@ -67,5 +70,8 @@ Source Files + + Source Files + \ No newline at end of file diff --git a/P25Parrot/Thread.cpp b/P25Parrot/Thread.cpp new file mode 100644 index 0000000..b334436 --- /dev/null +++ b/P25Parrot/Thread.cpp @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "Thread.h" + +#if defined(_WIN32) || defined(_WIN64) + +CThread::CThread() : +m_handle() +{ +} + +CThread::~CThread() +{ +} + +bool CThread::run() +{ + m_handle = ::CreateThread(NULL, 0, &helper, this, 0, NULL); + + return m_handle != NULL; +} + + +void CThread::wait() +{ + ::WaitForSingleObject(m_handle, INFINITE); + + ::CloseHandle(m_handle); +} + + +DWORD CThread::helper(LPVOID arg) +{ + CThread* p = (CThread*)arg; + + p->entry(); + + return 0UL; +} + +void CThread::sleep(unsigned int ms) +{ + ::Sleep(ms); +} + +#else + +#include + +CThread::CThread() : +m_thread() +{ +} + +CThread::~CThread() +{ +} + +bool CThread::run() +{ + return ::pthread_create(&m_thread, NULL, helper, this) == 0; +} + + +void CThread::wait() +{ + ::pthread_join(m_thread, NULL); +} + + +void* CThread::helper(void* arg) +{ + CThread* p = (CThread*)arg; + + p->entry(); + + return NULL; +} + +void CThread::sleep(unsigned int ms) +{ + ::usleep(ms * 1000); +} + +#endif diff --git a/P25Parrot/Thread.h b/P25Parrot/Thread.h new file mode 100644 index 0000000..352d938 --- /dev/null +++ b/P25Parrot/Thread.h @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2015,2016 by Jonathan Naylor G4KLX + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#if !defined(THREAD_H) +#define THREAD_H + +#if defined(_WIN32) || defined(_WIN64) +#include +#else +#include +#endif + +class CThread +{ +public: + CThread(); + virtual ~CThread(); + + virtual bool run(); + + virtual void entry() = 0; + + virtual void wait(); + + static void sleep(unsigned int ms); + +private: +#if defined(_WIN32) || defined(_WIN64) + HANDLE m_handle; +#else + pthread_t m_thread; +#endif + +#if defined(_WIN32) || defined(_WIN64) + static DWORD __stdcall helper(LPVOID arg); +#else + static void* helper(void* arg); +#endif +}; + +#endif