C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как подсунуть API функции указатель на функцию класса?  (Прочитано 7248 раз)
KA3AKOB
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 5


« : 19 Сентябрь 2013, 17:48:49 »

Есть 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;
}
//---------------------------------------------------------------------------

Может быть кто-нибудь подскажет как обойти ограничение?
С уважением,
Сергей Казаков.
« Последнее редактирование: 19 Сентябрь 2013, 18:27:07 от volvo877 » Записан
Rius
Давний друг
**

Сказали спасибо: +116/-5
Offline Offline

Сообщений: 753


WWW
« Ответ #1 : 19 Сентябрь 2013, 20:41:45 »

Про указатель на функцию класса забудьте.
Наследуйте свой класс от TThread и там всё пишите.
Записан
KA3AKOB
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 5


« Ответ #2 : 20 Сентябрь 2013, 10:34:44 »

Спасибо за ответ, уважаемый Rius. Однако, у меня задача не пользоваться стандартным классом TThread, а написать свой. Причина проста: мне надо разработать программу для Windows, в котором работает BC5, и под Линуксом, в котором используется не CreateThread(), а аналогичная POSIX API-функция pthread_create(). Не сомневаюсь, что в Борланде обернули стандартную API-функцию классом, оттуда и произошёл TThread. Хочу знать, как они это сделали.

С уважением,
Сергей Казаков.
Записан
Rius
Давний друг
**

Сказали спасибо: +116/-5
Offline Offline

Сообщений: 753


WWW
« Ответ #3 : 20 Сентябрь 2013, 10:48:32 »

Тут примеры этого:
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
Участник
**

Сказали спасибо: +0/-0
Offline Offline

Сообщений: 5


« Ответ #4 : 20 Сентябрь 2013, 15:45:35 »

Спасибо за помощь, уважаемый Rius!
Очень изящное решение. Всё работает.

С уважением,
Сергей Казаков.

Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2006, Simple Machines
Страница сгенерирована за 0.069 секунд. Запросов: 23.