110 lines
2.3 KiB
C++
110 lines
2.3 KiB
C++
// CrossThreads
|
|
// Copyright Jeroen Saey
|
|
// Created 29-01-2013
|
|
// CrossThread.cpp
|
|
|
|
#include "CrossThreads.h"
|
|
#include "errno.h"
|
|
#include <iostream>
|
|
|
|
CrossThreads::CrossThreads(threadCallBack callBack, long timeout) : _callBack(callBack), _threadID(0)
|
|
#ifdef __WIN32__
|
|
, _timeout(timeout) , _thread(NULL)
|
|
#endif
|
|
{
|
|
}
|
|
|
|
CrossThreads::~CrossThreads()
|
|
{
|
|
stop();
|
|
}
|
|
|
|
void CrossThreads::stop()
|
|
{
|
|
#ifdef __WIN32__
|
|
//waiting for the thread to terminate
|
|
if (_thread)
|
|
{
|
|
if (WAIT_TIMEOUT == ::WaitForSingleObject (_thread, _timeout))
|
|
::TerminateThread (_thread, 1);
|
|
|
|
::CloseHandle (_thread);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
int CrossThreads::create()
|
|
{
|
|
|
|
#ifdef __WIN32__
|
|
_thread = ::CreateThread (NULL, 0,
|
|
(unsigned long (__stdcall *)(void *))_callBack,
|
|
NULL, 0, &_thread);
|
|
if (NULL == _thread)
|
|
{
|
|
break;
|
|
}
|
|
#endif
|
|
|
|
pthread_attr_t attribute;
|
|
|
|
// Initialize and set thread and set the attribute
|
|
pthread_attr_init(&attribute);
|
|
pthread_attr_setdetachstate(&attribute, PTHREAD_CREATE_DETACHED);
|
|
|
|
int result;
|
|
do
|
|
{
|
|
result = pthread_create(&_threadID, &attribute, _callBack, (void *)this);
|
|
} while (false);
|
|
|
|
if (result != 0)
|
|
{
|
|
std::cout << "CrossThread: Failed to create the thread\n";
|
|
if (result == EAGAIN)
|
|
{
|
|
std::cout << "The system lacked the necessary resource to create another thread";
|
|
}
|
|
else if (result == EINVAL)
|
|
{
|
|
std::cout << "CrossThread: The value given in the arguments is invalid!";
|
|
}
|
|
else
|
|
{
|
|
std::cout << "CrossThread: The caller does not have the appropriate rights";
|
|
}
|
|
}
|
|
|
|
// Free the attributes of the thread
|
|
pthread_attr_destroy(&attribute);
|
|
return result;
|
|
}
|
|
|
|
void CrossThreads::join()
|
|
{
|
|
if (0 != pthread_join(_threadID, NULL))
|
|
{
|
|
fprintf(stderr, "pthread_join error\n");
|
|
}
|
|
}
|
|
|
|
int CrossThreads::remove()
|
|
{
|
|
return pthread_detach(_threadID);
|
|
}
|
|
|
|
unsigned long CrossThreads::getThreadID()
|
|
{
|
|
return printf("%lu\n", (unsigned long) _threadID);
|
|
}
|
|
|
|
void CrossThreads::setThreadCallback(threadCallBack callBack)
|
|
{
|
|
_callBack = callBack;
|
|
}
|
|
|
|
bool CrossThreads::isCreated()
|
|
{
|
|
return _threadID ? true : false;
|
|
}
|