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