Visual Servoing Platform version 3.5.0
vpThread.h
1/****************************************************************************
2 *
3 * ViSP, open source Visual Servoing Platform software.
4 * Copyright (C) 2005 - 2019 by Inria. All rights reserved.
5 *
6 * This software is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 * See the file LICENSE.txt at the root directory of this source
11 * distribution for additional information about the GNU GPL.
12 *
13 * For using ViSP with software that can not be combined with the GNU
14 * GPL, please contact Inria about acquiring a ViSP Professional
15 * Edition License.
16 *
17 * See http://visp.inria.fr for more information.
18 *
19 * This software was developed at:
20 * Inria Rennes - Bretagne Atlantique
21 * Campus Universitaire de Beaulieu
22 * 35042 Rennes Cedex
23 * France
24 *
25 * If you have questions regarding the use of this file, please contact
26 * Inria at visp@inria.fr
27 *
28 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30 *
31 * Description:
32 * Threading capabilities
33 *
34 * Authors:
35 * Fabien Spindler
36 *
37 *****************************************************************************/
38#ifndef _vpPthread_h_
39#define _vpPthread_h_
40
41#include <visp3/core/vpConfig.h>
42#include <visp3/core/vpException.h>
43
44#if defined(VISP_HAVE_PTHREAD) || (defined(_WIN32) && !defined(WINRT_8_0))
45
46#if defined(VISP_HAVE_PTHREAD)
47#include <pthread.h>
48#include <string.h>
49#elif defined(_WIN32)
50// Include WinSock2.h before windows.h to ensure that winsock.h is not
51// included by windows.h since winsock.h and winsock2.h are incompatible
52#include <WinSock2.h>
53#include <windows.h>
54#endif
55
74{
75public:
76#if defined(VISP_HAVE_PTHREAD)
77 typedef void *Args;
78 typedef void *Return;
79 typedef void *(*Fn)(Args);
80 typedef pthread_t Handle;
81#elif defined(_WIN32)
82 typedef LPVOID Args;
83 typedef DWORD Return;
84 typedef LPTHREAD_START_ROUTINE Fn;
85 // typedef DWORD (*Fn)(Args);
86 typedef HANDLE Handle;
87#endif
92 vpThread() : m_handle(), m_isCreated(false), m_isJoinable(false) {}
93
101 {
102 create(fn, args);
103 }
104
110 void create(vpThread::Fn fn, vpThread::Args args = NULL)
111 {
112 if (m_isCreated)
113 throw vpException(vpException::fatalError, "The thread is already created");
114#if defined(VISP_HAVE_PTHREAD)
115 int err = pthread_create(&m_handle, NULL, fn, args);
116 if (err != 0) {
117 throw vpException(vpException::cannotUseConstructorError, "Can't create thread : %s", strerror(err));
118 }
119#elif defined(_WIN32)
120 DWORD dwThreadIdArray;
121 m_handle = CreateThread(NULL, // default security attributes
122 0, // use default stack size
123 fn, // thread function name
124 args, // argument to thread function
125 0, // use default creation flags
126 &dwThreadIdArray); // returns the thread identifier
127#endif
128
129 m_isJoinable = true;
130 }
131
135 virtual ~vpThread()
136 {
137 join();
138#if defined(VISP_HAVE_PTHREAD)
139#elif defined(_WIN32)
140 CloseHandle(m_handle);
141#endif
142 }
143
154 void join()
155 {
156 if (m_isJoinable) {
157#if defined(VISP_HAVE_PTHREAD)
158 pthread_join(m_handle, NULL);
159#elif defined(_WIN32)
160#if defined(WINRT_8_1)
161 WaitForSingleObjectEx(m_handle, INFINITE, FALSE);
162#else
163 WaitForSingleObject(m_handle, INFINITE);
164#endif
165#endif
166 m_isJoinable = false;
167 }
168 }
169
175
185 bool joinable() { return m_isJoinable; }
186
187protected:
191};
192
193#endif
194#endif
error that can be emited by ViSP classes.
Definition: vpException.h:72
@ cannotUseConstructorError
Contructor error.
Definition: vpException.h:92
@ fatalError
Fatal error.
Definition: vpException.h:96
void * Return
Definition: vpThread.h:78
bool m_isCreated
Indicates if the thread is created.
Definition: vpThread.h:189
virtual ~vpThread()
Definition: vpThread.h:135
void *(* Fn)(Args)
Definition: vpThread.h:79
bool joinable()
Definition: vpThread.h:185
Handle getHandle()
Definition: vpThread.h:174
void * Args
Definition: vpThread.h:77
void create(vpThread::Fn fn, vpThread::Args args=NULL)
Definition: vpThread.h:110
pthread_t Handle
Definition: vpThread.h:80
vpThread(vpThread::Fn fn, vpThread::Args args=NULL)
Definition: vpThread.h:100
vpThread()
Definition: vpThread.h:92
Handle m_handle
Thread handle.
Definition: vpThread.h:188
bool m_isJoinable
Indicates if the thread is joinable.
Definition: vpThread.h:190
void join()
Definition: vpThread.h:154