Как подсунуть API функции указатель на функцию класса?
(1/1)
KA3AKOB:
Есть API функция CreateThread в ней 3 параметром стоит указатель на автономную функцию потока. Хочу написать класс потока наподобие TThread такой, чтобы можно было в конструкторе обращаться к автономной С-функции CreateThread и подсунуть ей указатель на функцию класса. Пока компилятор отказывается, пишет:
[C++ Error] CreateThreadMain.cpp(34): E2034 Cannot convert 'unsigned long (__stdcall * (_closure )(void *))(void *)' to 'unsigned long (__stdcall *)(void *)'
[C++ Error] CreateThreadMain.cpp(34): E2342 Type mismatch in parameter 'lpStartAddress' (wanted 'unsigned long (__stdcall *)(void *)', got 'unsigned long (__stdcall * (_closure )(void *))(void *)')
текст программы для прояснения вопроса следует ниже:
Код
#include <iostream>
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
using namespace std;
DWORD WINAPI ThreadFunc( LPVOID )
{
cout<<"Thread executed."<<endl;
return 0L;
}
class A
{
HANDLE hThread;
DWORD threadId;
public:
A();
DWORD WINAPI ThreadFuncA( LPVOID ) {return 0L;};// пока ничего не делаем
};
A::A()
{
this->hThread = ::CreateThread(NULL, NULL, &(this->ThreadFuncA), NULL, CREATE_SUSPENDED, &(this->threadId));// здесь ошибка
cout<<"object of type A created."<<endl;
};
int main(int argc, char* argv[])
{
DWORD threadId;
HANDLE hThread = ::CreateThread(NULL, NULL, &ThreadFunc, NULL, CREATE_SUSPENDED, &threadId);
if (hThread==NULL) {
cout<<"thread not created."<<endl;
return -1;
}
ResumeThread(hThread);
Sleep(1000);
A a;
cout<<"completed!"<<endl;
return 0;
}
//---------------------------------------------------------------------------
Может быть кто-нибудь подскажет как обойти ограничение?
С уважением,
Сергей Казаков.
Rius:
Про указатель на функцию класса забудьте.
Наследуйте свой класс от TThread и там всё пишите.
KA3AKOB:
Спасибо за ответ, уважаемый Rius. Однако, у меня задача не пользоваться стандартным классом TThread, а написать свой. Причина проста: мне надо разработать программу для Windows, в котором работает BC5, и под Линуксом, в котором используется не CreateThread(), а аналогичная POSIX API-функция pthread_create(). Не сомневаюсь, что в Борланде обернули стандартную API-функцию классом, оттуда и произошёл TThread. Хочу знать, как они это сделали.
С уважением,
Сергей Казаков.
Rius:
Тут примеры этого:
http://stackoverflow.com/questions/10673585/start-thread-with-member-function
http://stackoverflow.com/questions/7809987/c-how-to-define-a-class-method-as-a-start-routine-to-thread-with-pthread-lib
KA3AKOB:
Спасибо за помощь, уважаемый Rius!
Очень изящное решение. Всё работает.
С уважением,
Сергей Казаков.
Навигация