Strona 1 z 1

[SOLVED]Klasa wzorcowa

: 03 sty 2009, 19:29
autor: Hauleth

Kod: Zaznacz cały

template < class T = int > class thread {
	private:
		void* (*func)( void* ); ///< Wskaźnik na funkcję, która ma być wątkiem.
		pthread_t th; ///<
		T* args; ///< Argumenty przekazywane do funkcji
		thread_attr* param;
		bool state; ///< status wątku
	public:
		/**
		 * @brief Konstruktor klasy @b Thread
		 *
		 * @param _func Wskaźnik do fungkcji, która ma zostać wywołana jako osobny wątek.
		 * @param _args Wskaźnik do argumentów, które mają zostać przekazane nowemu wątkowi
		 * @return
		 */
		thread( void*(*_func)( void* ), T* _args = NULL ) :
			func( _func ), args( _args ), state( false ) {
		};
		int start( const thread_attr* _param = NULL ) throw(threadError) {
			if ( state ) {
				throw threadError( "This thread has already started." );
			}
			int ret = NULL;
			param = (thread_attr*) _param;
			ret = pthread_create( &th, param, func, (void*) args );
			return ret;
		}
		void stop();
		void join() {
			pthread_join( th, NULL );
		}
};
Mam taką oto klasę ? i zastanawiam się jak ją nakłonić by przyjęła jako argument wzorca char*.

Edit:
Teraz mam problem bo muszę zrobić coś takiego:

Kod: Zaznacz cały

void * test( void * params ) {
 char** s = (char**)params;
 /* reszta kodu */
}
I to podać konstruktorowi, ale ten kod mnie nie zadowala :/

Odp: Klasa wzorcowa

: 04 sty 2009, 15:15
autor: pinochet
rozumiem że błąd kompilacji ? spróbuj typename albo podaj bezwzględnie nazwę typu przez thread<T>*

Odp: Klasa wzorcowa

: 04 sty 2009, 19:18
autor: el.pescado
Dlaczego wskaźnika do funkcji nie zadeklarujesz jako:

Kod: Zaznacz cały

T (*func)(T);
?

Odp: Klasa wzorcowa

: 04 sty 2009, 20:26
autor: Hauleth
Nie nie ma błędu kompilacji. @el.pescado nie może być taka funkcja, bo to ma ułatwiać pracę z pthread, a jako argument pthread podaje się funkcję typu void* func( void* ). Obszedłem to tworząc typeneme char* cstring, ale i tak to mnie nie zadowala, jeśli nie ma innego rozwiązania, to jakoś przeżyję, ale to jak jest teraz nie za bardzo mi się podoba :/

Odp: Klasa wzorcowa

: 04 sty 2009, 20:47
autor: mikolajs
by przyjęła jako argument wzorca char*.
Zdaje się, że w takich sytuacjach dla wskaźników robi się specjalizowaną wersję klasy.

Odp: Klasa wzorcowa

: 04 sty 2009, 20:55
autor: Hauleth
A jak ją poinformować, którą klasę ma wybrać??

Odp: Klasa wzorcowa

: 04 sty 2009, 21:01
autor: mikolajs
Piszesz klasę class thread<char*> kompilator najpierw spróbuje użyć tej klasy, a dopiero jeżeli nie pasuje ona do wzroca, to wyprodukuje z szablonu. Polecam "Pasja C++" :)

Odp: Klasa wzorcowa

: 04 sty 2009, 22:33
autor: Hauleth
Dzięki. Muszę sobie kupić tę książkę.

PS
Biblioteka moja powoli nabiera kształtu ( ma być taką mini biblioteką ułatwiającą częste [wg mnie] prace na POSIX'ach ) :)

Odp: [SOLVED]Klasa wzorcowa

: 05 sty 2009, 17:02
autor: mikolajs
A widziałeś commoncpp2?
Szablon w tym wypadku wydaje mi się zbędny. Lepiej jest dziedziczyć po klasie wątku. Sam korzystam czasami z wątków w QT4, które też opierają się na phtread.

Odp: [SOLVED]Klasa wzorcowa

: 05 sty 2009, 19:21
autor: Hauleth
Nie nie widziałem. Może i tak, ale ja wolę wiedzieć co i jak. Tak mam wszystko jasne i klarowne.