Das Zuhause des Powerhamsters

Lösung für Threaderstellung

Problem:

Man kann einen POSIX Thread keine Funktionspointer auf Member-Methoden mitgeben da diese mit dem Typ nicht überein stimmen. Den verlangten Typ void*(*)(void*) erreicht man nur mit statischen Methoden bzw. globalen Funktionen.

Lösung:

Da man in statischen Methode keine Objektinstanz zur Verfügung hat übergibt man ihr eine Instanz, in dem Fall this.

Codeschnippsel C++ (Server.h)
class Server
{
	private:
		int port;
		int maxConnections;
		Socket * socket;
		static void * interact(void * arg);
	public:
		Server(int port, int maxConnections);
		...
};
typedef struct
{
	Server * server;
	int clientSocket;
} ThreadInfo;
 
Codeschnipsel C++ (Server.cpp)
#include "Server.h"
...
#include <pthread.h>
...
Server::Server(int port, int maxConnections)
:port(port), maxConnections(maxConnections)
{
	...
	pthread_t thread;
	int cSocket;
	try
	{
		while(true)
		{
			if((cSocket = this->socket->accept(this->port)))
			{
				ThreadInfo * info = new ThreadInfo();
				info->server = this;
				info->clientSocket = cSocket;
				pthread_create(&thread,NULL,Server::interact,info);
				pthread_detach(thread);
			}
		}
	}
	catch(int exception)
	{
		...
	}
}
void * Server::interact(void * arg)
{
	ThreadInfo * info = ((ThreadInfo*)arg);
	Server * server = info->server;
	int clientSocket = info->clientSocket;
	...
	delete info;
	return server;
}
  
Letze Änderung: 08.06.2008 03:29