Touchy subject I know, but I'm currently trying some stuff to understand Threads better in C++.
I've read the Windows API documentation regarding Threads, and want to build a Thread class that can run any kind of function as a seperate thread by utilising function pointers.
This is the code I currently have so far:
header file
source file
Current output from compiler:
[BCC32 Error] Thread.cpp(68): E2314 Call of nonfunction
And that points to the following line:
Bit clueless on the topic, so could someone explain it tome what I'm doing wrong?
I've read the Windows API documentation regarding Threads, and want to build a Thread class that can run any kind of function as a seperate thread by utilising function pointers.
This is the code I currently have so far:
header file
Code:
//--------------------------------------------------------------------------- #ifndef ThreadH #define ThreadH #include <windows.h> /* Windows Definitions of the types DWORD = unsigned long SIZE_T = unsigned int LPVOID = void* */ class Thread { public: Thread(int* FunctionAddress, int* ParamList); ~Thread(); bool Execute(bool Suspend); void StartThread(); protected: static DWORD WINAPI ThreadMainFunction(void* Param); private: bool mSuspended; int* mFunctionAddress; int* mParamList; unsigned long* mThreadId; HANDLE mMyThread; }; //--------------------------------------------------------------------------- #endif
Code:
//--------------------------------------------------------------------------- #pragma hdrstop #include "Thread.h" // This function is the constructor of the thread. // It takes 2 arguments, both are a pointer. // FunctionAddress is a pointer to the function beeing // called. // Paramlist is a the data passed as func arg. Thread::Thread(int* FunctionAddress, int* ParamList) { // Assign the variables to our internal datamembers mFunctionAddress = FunctionAddress; mParamList = ParamList; } //--------------------------------------------------------------------------- Thread::~Thread() {} //--------------------------------------------------------------------------- // This function creates the thread and starts it. bool Thread::Execute(bool Suspend = false) { // Store if we are suspended or not. mSuspended = Suspend; // Create the Thread. if(true == Suspend) { mMyThread = ::CreateThread(0, 0, ThreadMainFunction, this, CREATE_SUSPENDED, mThreadId); } else { mMyThread = ::CreateThread(0, 0, ThreadMainFunction, this, 0, mThreadId); } // Return the assing result of myThread. return (0 != mMyThread); } //--------------------------------------------------------------------------- // This function starts the thread if it hasn't started already. void Thread::StartThread() { if((true == mSuspended) && (0 != mMyThread)) { ::ResumeThread(mMyThread); } } //--------------------------------------------------------------------------- // This function is the real mainloop of the thread. // Once this function returns the tread is ended. // Because Windows only accepts functions in the format // DWORD WINAPI FuncProc(LPVOID param), we create this // signature and call the function ourselves from within // this function. // Function is declared static to prevent compiler errors about // accessing data. DWORD WINAPI Thread::ThreadMainFunction(void* Param) { // Cast our object back to a Thread Thread* myself = static_cast<Thread*>(Param); // Call the actuall function to be executed. return (*(myself->mFunctionAddress)(myself->mParamList)); } //--------------------------------------------------------------------------- #pragma package(smart_init)
[BCC32 Error] Thread.cpp(68): E2314 Call of nonfunction
And that points to the following line:
Code:
return (*(myself->mFunctionAddress)(myself->mParamList));
Comment