PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : probs mit threads



mithras
09-09-2002, 16:30
Hallo habe Problem mit threads, habe unten code ausschnitt gepostet.
Mein Problem ist, dass das Argument das ich der Funktion
senden übergebe (input) nicht in der Funktion senden korrekt verfügbar ist.





int connecten(char *text)

char input[SIZE_EMPFANGEN];
pthread_t t1;
strcpy(input, text);


if(pthread_create(&t1, NULL, (void *)&senden, sock, input) != 0)
{
fprintf(stderr, "Fehler bei Thread ......\n");
exit(0);
}









int senden(int f_s, char *message)
{

// char message[SIZE_EMPFANGEN];
int bytes;

printf("message: %s", message);

}

anda_skoa
09-09-2002, 17:23
diese Version der Funktion pthread gibt es glaub ich nicht.

#> man pthread_create
bringt bei mir:



#include <pthread.h>

int pthread_create(pthread_t * thread, pthread_attr_t *
attr, void * (*start_routine)(void *), void * arg);


Da kommt nach der Funktion des Threads nur ein void* als Parameter, nicht zwei, wie bei dir.

Falls du keine andere Implementierung von pthread hast als ich, mußt du das so schreiben:



struct ThreadArgs {
int sock;
char message[SIZE_EMFANGEN];
};

ThreadArgs t1_args;

int connecten(char* text) {
strcpy(t1_args.message, text);
if(pthread_create(&t1, NULL, (void *)&senden, &t1_args) != 0)
{
fprintf(stderr, "Fehler bei Thread ......\n");
exit(0);
}
}

void senden(void* targs) {
ThreadArgs* args = (ThreadArgs*) targs;

printf("message: %s", args.message);
}


Ciao,
_

mithras
09-09-2002, 21:10
hm sorry aber irgendwie verstehe ich deinen code nicht so ganz.
Auf jeden Fall weiß ich jetzt dass ich das ganze mit einer Struktur machen muss. Ich habe das jetzt versucht selbst zu lösen, und zwar folgendermaßen:



// Die Struktur!
struct ThreadArgs{
int sock;
char input[SIZE_EMPFANGEN];
} t1_args;





int connecten(char *text)
{

pthread_t t1;
strcpy(t1_args.input, text);


if (connect(t1_args.sock, &client, sizeof(client)) < 0) // Es wird zum Server connected
{
puts("connect() failed!");
}

else
{
puts("Connect war erfolgreich!");
puts("Zielrechner ist online!");


// if(pthread_create(&t1, NULL, senden, sock, input) != 0)

if(pthread_create(&t1, NULL, (void *)&senden, &t1_args) != 0)
{
fprintf(stderr, "Fehler bei Thread ......\n");
exit(0);
}

}






int senden(struct ThreadArgs x )
{

int bytes;

printf("messag: %s", x.input);

bytes = send(x.sock, x.input, strlen(x.input), 0);

if (bytes == -1)
{
perror("send() failed");
return -1;

}


printf("Es wurde %s gesendet!", x.input);
pthread_exit((void *) 0);

return 0;

}



anstatt dass er aber nun den string richtig übergibt, gibt er nur missverständliche zeichen aus, und der filediskriptor wird auch falsch übergeben!
Ich vermute ja dass ich das ganze mit Strukturen in Verbindung mit Zeigern machen muss?! NUr kann ich die dann auch einer Fkt. übergeben.

mithras
09-09-2002, 21:46
ok, habs selbst himbekommen, wie bereits vermutet mit einem zeiger als instanz einer struktur (ich glaub das heißt so *g)

trotzdem danke! anda_skoa!

aber ich glaub an dem code den du mir gepostet hast ist einiges falsch (bin mir nicht sicher!)

anda_skoa
09-09-2002, 22:46
Zeiger auf eine Instanz der Struktur :)

Mein Code war auch nicht als "echter" Code gedacht, sondern als Hinweis, wie man mehr als einen Parameter an einen Thread übergibt.
Ich selbst hab noch nie mit pthreads gearbeitet, ich benutze immer C++ Bibliotheken :D

Ciao,
_