[C++]Tworzenie watkow z kilkoma argumentami

0

Hey guys!

W jaki sposob stworzyc watek na funkcji, która ma kilka argumentów? I czy mozna podac do towrzenia funkcje nalezaca do przestrzeni?

Załóżmy, że mamy kod:

void LLotnisko::wlaczAutooperatora(){
//...

pthread_t watek;
pthread_create(&watek, NULL, wystartujSamolot, chosen, czyszeroki)

//...
}

void LLotnisko::wystartujSamolot(int id, bool czy Szeroki)
{
//...
}

Nie działa z kilku powodów:
pthread_create moze przybrac tylko jeden argument dla funcji a probuję dać mu dwa. Oraz wystartujSamolot(...) nalezy do przestrzeni nawet jak dam:
pthread_create(&watek, NULL, LLotnisko::wystartujSamolot, chosen, czyszeroki)
Nie działa.

Probuje zrobić funkcje globalne, które będą wywoływały wystartuj samolot, mniej więcej tak:

void LLotnisko::wlaczAutooperatora(){
//...

pthread_t watek;
pthread_create(&watek, NULL, wsS, chosen, czyszeroki, lotnisko)

//...
}

void* wsS(void * arg)
{

}

i funkcja wsS wywoływałaby by funkcje wystartujSamolot dla odpowiedniego lotniska. Ale nadal mam problem z liczba argumentów! Myślałem by jakoś zapakować te trzy do tablicy i bawić się z typami, ale przerosło mnie.

Liczę na waszą pomoc!

Kamil

0

Oczywiście, że możesz przekazywać parametry. Od tego jest ostatni parametr w pthread_create, który jest przekazywany jako argument do funkcji w której zawiera się funkcjonalność wątku. Jeżeli masz tych parametrów więcej zgrupuj je ze sobą w strukturę. Wtedy:

struct param {
    int id; bool czySzeroki;
}
//...
param p;
p.id = 2;
//...
pthread_create(&watek, NULL, wsS, (void*)&p);
//...
void* wsS(void* arg) {
    param* p = (param*)arg;
    LLotnisko::wystartujSamolot(p->id, p->czySzeroki);
}
0

Dziękuję przyjacielu. Prawie działa. na razie to wygląda tak:

Struct param{
int id;
bool czySzeroki;
LLotnisko * lotnisko;
}

LLotnisko::wlaczAutooperatora()
{
//...

p.id=chosen;
p.czySzeroki=true;
p.lotnisko=this;
...

}
void * wsS(void* arg)
{
...
p->lotnisko->wystartujSamolot(p->id, p->czySzeroki)

Ale mam kłopot z konstruktorem:

return type specification for construktor invalid

Jak powinien wyglądać konstruktor. na razie wygląda tak:

LLotnisko::LLotnisko(Komunikacja * kom, int idLotniska)
	{
	set_ile_szerokich_wolnych(1);
	set_ile_waskich_wolnych(1);
zasieg=(float)R;

	autooperator = false;	
	kom->lotnisko=this;
	
	
	for (int i=0;i<3;i++){
		awaria[i]=false;
	}
	
	for (int i=0;i<N;i++){
		listaSamolotow[i]=NULL;
		lista_ziemia[i]=NULL;
		lista_powietrze[i]=NULL;
	}	
		
	set_wspolczynnikObslugi(1);

komunikacja = kom;
komunikacja->DB_getLotnisko( idLotniska, this);
	cout<<"nazwa "<<nazwa<<endl;
	szerokosc=60.00;
	dlugosc=60.00;
	
};

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