WinAPI, Wątki

0

Mam funkcję w klasie:

DWORD WINAPI FunkcjaWatku2(PVOID pvParam)
	{
	for(;;)
	{
		cout << "tekst" << (int)pvParam;
		wait(1);
	}
	return 0;
	}

i obsługę guzika:

switch (message)
	{
	case WM_COMMAND:
				if(((HWND)lParam) && (HIWORD(wParam) == BN_CLICKED))
				{
                int iMID;
                iMID = LOWORD(wParam);
				switch(iMID)
				{
				case ID_BUTTON1:	
					  Nowy = new Bot();
					
					  DWORD IdWatku;
					  CreateThread(NULL, 0, Nowy->FunkcjaWatku2, (PVOID)c, 0, &IdWatku);
					break;
				default:
					break;
					}
				}
				break;

Otrzymuję błąd:

error C3867: 'Bot::FunkcjaWatku2': function call missing argument list; use '&Bot::FunkcjaWatku2' to create a pointer to member

Jeśli nie wywołam funkcji z obiektu klasy, tylko zwykłej, nie umieszczonej w klasie to działa. Co zrobić, żeby to działało (obsługa wątku), jeśli wywołuję funkcję z obiektu klasy?

0

Chyba funkcja powinna być fun . statyczną , czyli trochę ogranicza to jej zastosowanie:

#include <iostream>
#include <windows.h>

class Obiekt {
static int a ;
public:
            //----
static DWORD __stdcall Funkcja(PVOID pvParam) {
std::cout << "tekst - ";
a = 10 ;
cout << a << endl ;
return 0;
}
//--------

};

int Obiekt::a = 0 ;

int main() {
Obiekt* obiekt=new Obiekt();
DWORD watek ;

CreateThread(NULL,0,obiekt->Funkcja,NULL,0,&watek);
/*
    lub tak
CreateThread(NULL,0,Obiekt::Funkcja,NULL,0,&watek);

*/
cin.get();
delete obiekt ;
return 0;
}

Może lepiej odwrócić sytuację tzn. Funkcję wątku zrobić globalną i przekazać
jako parametr obiekt , wtedy nie będzie tego ograniczenia .

#include <iostream>
#include <windows.h>


class Obiekt {
                 int a ;
public:
            //----
  DWORD  FunkcjaW_Watku(void)                //  test 
{
                        a = 10 ;
        for(;;)
        {
                cout << "tekst - " << a << endl;

                Sleep(1000);
        }
        return 0;          ///    Unreachable Code   <<
}

};
//------------------------------------------------
DWORD WINAPI FunkcjaWatku2(PVOID pvParam)
        {
                 ((Obiekt*)pvParam) -> FunkcjaW_Watku() ;
        }


//-------------------------------------------------
int main() {
Obiekt* obiekt=new Obiekt();
DWORD watek ;

CreateThread(NULL,0,FunkcjaWatku2,obiekt,0,&watek);

cin.get();
delete obiekt ;
return 0;
}

Oczywiście trzeba tak zorganizować kod aby obiekt nie zniknął gdy wątek jeszcze działa .

0

albo uzyc boost::bind lub boost::bind ktore zrobia to za Ciebie :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1