Для реализации класса потока (In C++98
и Windows.h
).У меня есть что-то вроде этого:
Thread::Thread(_beginthreadex_proc_type fn)
{
m_raw = fn;
m_args = 0;
m_handle = 0;
m_id = 0;
}
Приведенный выше код работает нормально, он принимает функцию, которая не получает параметры, и со следующим кодом эта функция вызывается новым потоком:
void Thread::Join()
{
m_handle = (HANDLE)_beginthreadex(0, 0, m_raw, (m_args ? m_args : 0), 0, 0);
if (m_handle) WaitForSingleObject(m_handle, INFINITE);
}
Этот код также отлично работает с функциями, которые не принимают никаких параметров.Теперь мой вопрос о том, как я могу в C ++ 98 получить переменные параметры в моем конструкторе и сохранить их.И NO я не могу использовать современный c ++, если бы это было так, мне не нужна помощь.Так что, плз, не давайте мне решения, реализованные с c ++ 11 или выше.
Обновление
Теперь я пробую решение в стиле Java, в котором каждый поток является IRunnable, который имеет чистыйвиртуальная функция с именем Run.И поток - почти то, что это реализация с diff, который является абстрактным классом.Таким образом, я могу избежать параметров, потому что я не передаю функцию, вместо этого я пишу другой класс, который наследуется от Thread и реализует Run.Код выглядит так:
Интерфейс
struct IRunnable
{
virtual void Run() = 0;
};
Класс потока
class Thread : public IRunnable
{
HANDLE m_handle;
DWORD m_id;
typedef unsigned (__stdcall *Function)(void*);
_beginthreadex_proc_type m_raw;
void* m_args;
public:
Thread();
~Thread();
Thread(_beginthreadex_proc_type, void*);
Thread(_beginthreadex_proc_type);
unsigned GetId();
virtual void Run() = 0;
void Join();
unsigned int __stdcall call(void*);
};
Вызов только является оберткой для вызова члена функции Run
unsigned int __stdcall Thread::call(void* data)
{
Run();
return 0;
}
Моя проблема здесь:
void Thread::Join()
{
m_handle = (HANDLE)_beginthreadex(0, 0, &this->call, 0, 0, 0);
if (m_handle) WaitForSingleObject(m_handle, INFINITE);
}
Когда я компилирую в vs2019, код выше выдает следующую ошибку:
error C2276: '&': illegal operation on bound member function expression
error C2660: '_beginthreadex': function does not take 5 arguments