C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
CreateThread, Как создать поток в методе класса?
Jojobets
Отправлено: 18.05.2005, 15:16


Ученик-кочегар

Группа: Участник
Сообщений: 16



В одном из методов класса пытаюсь создать поток при помощи CreateThread на основе другого метода этого же класса (динамического). И ничего не выходит.

class myclass
{
public:
__fastcall myclass();
DWORD WINAPI method1(LPVOID);
void __fastcall method2();
};
__fastcall myclass::myclass(){}
DWORD WINAPI myclass::method1(LPVOID)
{
//Что-то делаем...
ExitThread(0);
return 0;
}
void __fastcall myclass::method2()
{ unsigned long threadID;
HANDLE mthread;
mthread = CreateThread(NULL,0,method1,0,0,&threadID);
}

Как можно решить проблему?
xim
Отправлено: 18.05.2005, 19:38


Станционный диспетчер

Группа: Участник
Сообщений: 143



CODE

DWORD __declspec(dllexport) WINAPI TMyClass::ThreadFunc()
// при объявлении класса не забудь extern "C" {}
{
  // do anything
  return 0L;
}
//---------------------------------------------------------------------------
typedef DWORD (WINAPI *PThrFnc)(LPVOID);
//---------------------------------------------------------------------------
void TMyClass::any_method()
{
  PThrFnc func=(PThrFnc)GetProcAddress(GetModuleHandle(NULL),"@TMyClass@ThreadFunc$qqsv");
  if(func){
        DWORD thri;
        HANDLE thr=CreateThread(NULL,0,func,this,CREATE_SUSPENDED,&thri);
        if(thr){
           ResumeThread(thr);
           WaitForSingleObject(thr,100);
           CloseHandle(thr);
        }
  }
}


Но это не очень хороший стиль — передавать метод как процедуру исполнения потока. Кроме того, если TMyClass — наследник TWinControl, то возникают некоторые проблемы при работе с оконными обработчиками. А так — файлик пописать или какие-нибудь другие мелочи — можно.

Вернуться в Вопросы программирования в C++Builder