Newsgroup: it.comp.os.linux.development
Titolo: problema con thread

ciao, 
ho un problemino con la stesura di un codice in c++
premetto che sono assolutamente alle prime armi.
per creare un thread dichiaro nella classe la seguente funzione
static void *read_from_socket(void *in);
e lo faccio partire con pthread_create(...).
fino a qui funziona tutto perfettamente, ora devo chiamare alcune
funzioni che si trovano nella stessa classe del thread,
il problema sta nel fatto che il compilatore si ingrippa e mi dice
server.cpp:128: cannot call member function `Player*
Server::get_player_by_host(long unsigned int, int)' without object
(in pratica non riconosce il this) 
il problema si risolve se le funzioni da chiamare diventano anch'esse
statiche. E' corretto quello che sto facendo o c'è qualcosa che posso
modificare in modo da non trasfomare tutte le mie funzioni in statiche 
grazie
Saluti
Tchijevski Evgueni

 modificare in modo da non trasfomare tutte le mie funzioni in statiche 
Devi  usare qualcosa  di un  po' contorto,  visto che  non puoi  passare
direttamente un  metodo a pthread_create. Io  ho creato (a  tempo perso)
questo:
extern "C" {
#include <pthread.h>
}
#include <iostream>
/** Classe astratta Thread. Classe astratta che contiene i meccanismi 
 * di base per la gestione dei thread. Il parametro T indica il tipo 
 * accettato dalla funzione main (corpo del thread), il parametro R 
 * indica il tipo di ritorno della funzione main.
 */
template <typename T, typename R> class Thread {
	private:
		/* Thread id */
		pthread_t tid;
		/* Stato del thread */
		int state;
		enum {THREAD_FINISHED, THREAD_RUNNING, THREAD_CANCELLED};
		/* La funzione statica helper non riceve this, quindi
		 * devo fare in modo di passarglielo io.
		 */
		struct arg_t {
			Thread<T, R> *self;
			T args;
		} args;
		R ret_;
		/** Funzione helper. Funzione statica che fa da proxy
		 * per la funzione pthread_create() Deve essere statica, 
		 * altrimenti non potrebbe essere passata a
		 * pthread_crete.
		 *
		 * @param arg struttura arg_t castata a void *
		 *
		 * @return per compatibilita` con pthread_create. Il
		 * valore restituito e` sempre NULL.
		 * */
		static void *helper(void *arg) {
			arg_t *p = reinterpret_cast<arg_t *>(arg);
			p->self->state = THREAD_RUNNING;
			p->self->ret_ = p->self->main(p->args);
			p->self->state = THREAD_FINISHED;
			pthread_exit(NULL);
		};
		virtual R main(T) = 0;
	public:
		Thread(): tid(0), state(THREAD_FINISHED) { args.self = this; }
		virtual bool start();
		virtual bool start(T);
		virtual bool join();
		virtual void cancel();
		virtual void yield() { sched_yield(); }
 
		R ret() { return ret_; }
		void set_arg(T a) { args.args = a; }
};
template <typename T, typename R> bool Thread<T, R>::start() {
	if (state != THREAD_FINISHED)
		return false;
 
	void *p = reinterpret_cast<void *>(&args);
	if (pthread_create(&tid, NULL, helper, p) == 0)
		return true;
	else
		return false;
}
template <typename T, typename R> bool Thread<T, R>::start(T a) {
	if (state != THREAD_FINISHED)
		return false;
 
	set_arg(a);
	return start();
}
template <typename T, typename R> bool Thread<T, R>::join() {
	if (tid == 0)
		return false;
 
	if (pthread_join(tid, NULL) == 0) {
		tid = 0;
 
		return true;
	} else {
		tid = 0;
 
		return false;
	}
}
template <typename T, typename R> void Thread<T, R>::cancel() {
	pthread_cancel(tid);
        state = THREAD_CANCELLED;
}
Basta ereditare ed implementare il metodo main. Per funzionare funziona,
ma non e` molto testata ;)
ciao
Kronos
-- 
Home: 
http://kronoz.cjb.net
Ci sono due cose che l'uomo non puo` nascondere:
essere ubriaco ed essere innamorato.

 Kronos
grazie
adesso provo