PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : methode an thread übergeben?



Gaara
25.11.2010, 23:52
hi... ich sitz grad an nem programm und hab versucht nen thread zu initialisieren... zu beginn hab ich mit funktionen gearbeitet, da hat alles super geklappt, jetzt aber mach ich das ganze OO und wollte ne methode übergeben und dann bekomm ich nen error... kann mir jemand sagen ob ich mich für die paar thread relevante funktionen von OOP verabschieden muss oder kann ich irgendwie methoden verwenden?

ne 2. frage die nichts mit dem thema direkt zu tun hat aber auch mit threads würde ich auchh noch hier stellen, sollte das thema größer werden mach ich ein 2. topic:

ich hab mir letztens die frage gestellt wie man rießige socket programme wie icq organisiert und da dachte ich mir dass es am besten wäre für jede connection ein thread anzulegen weil 1 socket wohl sehr schnell überlastet wäre... jetzt frag ich mich, wie legt man threads dynamisch an?

zur info: ich arbeite mit boost::thread und VS2010

Hu5eL
26.11.2010, 08:28
zu 2. Bissl pseudocode
While true
s =accept(ss,...)
thread(s)
end while

G36KV
27.11.2010, 11:02
1.) guck mal boost bind Boost: bind.hpp documentation (http://www.boost.org/doc/libs/1_45_0/libs/bind/bind.html#with_functions)

Bei statischen Methoden hast du keine Probleme das zu übergeben, weil die Methoden auch ohne Objekt ansprechbar sind, einfach den Pointer holen. Bei dynamischen Methoden musst du mit boost bind arbeiten. Eine dynamische Methode exisitiert bekanntlich nie ohne das Objekt.

2.) Parameterübergabe ist dein Problem? boost bind...

Gaara
27.11.2010, 11:15
hier die lösung zu problem 1:

boost::thread t(&classenname::methode, &objekt);

und so übergibt man funktionen falls es jemand interessiert:

boost::thread t(boost::bind( &classname::methode, &objekt, parameter ));

wer auf problem 2 näher eingehen will darf das =P

edit:

was mich bei 2) beschäftigt ist... wird das überhaupt so gehandhabt? und wenn ja, wie würde das aussehen da es dann ja für jede connection 1 socket geben muss d.h. man müsste immer soviel threads wie connections haben. mir ist gerade unklar wie man das machen könnte, weil ein array hätte auch ne fixe anzahl oder gibt es möglichkeiten arrays "mitwachsen" zu lassen so dass bei jeder neuen verbindung ein thread-element dazu kommt?

G36KV
27.11.2010, 13:31
Ich weiss immer noch nicht genau was du bei 2 meinst. Schau doch mal mit einem besseren Taskmanager nach wieviele Threads dein ICQ Programm hat...

Natürlich kann man Arrays dynamisch wachsen lassen, in C++ hast du da mindestens 5 Möglichkeiten das zu tun... STL Containers - C++ Reference (http://www.cplusplus.com/reference/stl/)

Gaara
28.11.2010, 11:09
ok vielleicht versteh ich ja etwas falsch weswegen du das ganze nicht verstehst aber ich spreche eig vom icq server und nicht von client weswegen der tskmgr keinen sinn haben wird. ich zitiere eifach mal Jürgen Wolf:



Mehrere Clients gleichzeitig behandeln

[...] Die Verwendung von (Multi)Threads. Dabei wird für jeden client ein neuer Thread gestartet. [...]


Seite 976 in dem Buch c++ von A bis Z falls es jemand hat.

wacked
28.11.2010, 13:37
void proxy_thread_server( pvoid Arg )
{
ushort Port = *((ushort*)Arg);
SOCKADDR_IN Addr;
SOCKET Server,
Client;
memset( &Addr, 0, sizeof(Addr) );
Addr.sin_family = AF_INET;
Addr.sin_port = htons( Port );
Addr.sin_addr.s_addr = INADDR_ANY;
Server = socket( AF_INET, SOCK_STREAM, IPPROTO_TCP );
if( bind(Server, (struct sockaddr*)&Addr, sizeof(Addr)) == 0 )
{
if( listen(Server, SOMAXCONN) == 0 )
{
for( ;; )
{
/*
LOOK HERE DUMBFUCK.
*/
Client = accept( Server, NULL, NULL );
_beginthread( proxy_thread_client, 0, &Client );
}
}
}
closesocket( Server );
}
Als beispiel. Der wichtige part is markiert.

Gaara
28.11.2010, 13:51
ok, danke wacked! werds mir gleich mal anschauen. kann denk ich closed werden.

Dj Hackmaster A
28.11.2010, 18:08
fork() <3

Gaara
28.11.2010, 18:48
wäre das besser/einfacher umzusetzen?

AlterHacker
28.11.2010, 18:58
Da Dj HackMaster leider vor lauter Spammen keine Zeit hat, ordentliche Posts zu verfassen geh ich mal darauf ein:

int tid = 0;
if((tid = fork()) == 0){
//Dieser code wird nur vom Thread ausgeführt
objekt -> funktion();
} else {
//Hier sind wir im "Elternthread", in tid steht die ThreadId
if(tid == -1) error
}

fork(2): create child process - Linux man page (http://linux.die.net/man/2/fork)

_MrKode
29.11.2010, 19:50
1337 fork() stuff

Anzumerken ist, dass fork() nur auf Unix funktioniert. Allgemein würde ich dir erst einmal raten pthread.h zu nutzen, bevor du zu den sehr umfangreichen Boost libs wechselst. Man gewöhnt sich damit schnell an einfach sinnlos Libraries einzusetzen, die man eigentlich gar nicht benötigt.

Gaara
29.11.2010, 20:10
das mit unix hab ich gestern schon gemerkt... die andere thread lib werd ich mir mal anschaun, danke für den hinweis :)