Threads unter Windows und Werte übergeben



  • Hallo,
    ich habe (unter windows in C) ein Programm gecodet, das mit mehreren threads arbeitet.
    dafür verwende ich die funktion _beginthreads

    _beginthreads (FUNKTIONSNAME, 0, NULL);
    

    so starte ich die threads normal immer
    bei diesem programm muss ich der funktion, die als thread gestartet wird allerdings mehrere parameter übergeben, irgendwie geht das aber nicht wenn ich das einfach hinter NULL mit beistrichen anhänge...
    weiß da jemand rat?
    danke
    lg papanoah





  • msdn schrieb:

    http://msdn2.microsoft.com/en-us/library/kdzttdcb(VS.80).aspx

    habs mir mal angeguckt, und das gemacht:

    #include <stdio.h>
    #include <stdlib.h>
    
    void ausgabe (int *a, int *b, int *c)
    {
    printf ("1: %i\n"
            "2: %i\n"
            "3: %i\n",a,b,c);
    
    }
    
    int main(int argc, char *argv[])
    {
    int test1=1;
    int test2=2;
    int test3=3;
    
    _beginthread(ausgabe, 0, (int*)test1, (int*)test2, (int*)test3);
    
      system("PAUSE");	
      return 0;
    }
    

    allerdings habe ich wieder das selbe problem: test1 wird richtig übergeben, bei test2 und test3 funktioniert es allerdings nicht... :S
    lg papanoah



  • mir ist es nun mit diesem code gelungen, dass 3 zahlen richtig übergeben werden, aber ich wüsste net wie es geht wenn ich zahlen und buchstaben (int und char) übergeben muss...

    #include <stdio.h>
    #include <stdlib.h>
    
    void ausgabe (int *a)
    {
    int *hilfe;
    int d;
    
    //inhalt von a(adresse von test1) in hilfe speichern
    hilfe=*a;
    
    //Inhalt der variable auf die die adrese in hilfe zeigt, mit *hilfe ausgeben
    printf ("test1 in Funktion = %i\n",*hilfe);
    a++;
    
    hilfe=*a;
    
    printf ("test2 in Funktion = %i\n",*hilfe);
    a++;
    
    hilfe=*a;
    printf ("test3 in Funktion = %i\n",*hilfe);
    }
    
    int main(int argc, char *argv[])
    {
    int test1=1;
    int test2=2;
    int test3=3;
    int *args[3];
    
    printf ("Adresse test1 = %i \tWert = %i\n", &test1, test1);
    printf ("Adresse test2 = %i \tWert = %i\n", &test2, test2);
    printf ("Adresse test3 = %i \tWert = %i\n\n", &test3, test3);
    
    //Adresse holen
    args[0] = &test1;
    args[1] = &test2;
    args[2] = &test3;
    
    //thread starten und adresse von args[0] übergeben
    _beginthread(ausgabe, 0, args);
    
      system("PAUSE");	
      return 0;
    }
    

    bitte um hilfe 🙂
    lg papanoah



  • Du hast schon gut erkannt dass Du eine beliebige Adresse übergeben darfst. Also auch z.B. die einer Struktur:

    struct daten {
      int hilfe;
      const char *text;
      struct riiesenteil *einiges;
    };
    void ausgabe(struct daten* a)
    {
      printf("die zahl: %d\n", a->hilfe);
      printf("der text: %s\n", a->text);
      printf("der rest: ");
      riiesenteil_ausgeben(a->einiges);
    }
    int main(void)
    {
      struct daten d;
      d.hilfe = 12;
      d.text = "Hallo, Welt";
      d.einiges = malloc(sizeof(struct riiesenteil));
      _beginthread(ausgabe, 0, &d);
    
      return 0;
    }
    

    Wobei natürlich drauf zu achten wäre, dass der Zeiger d in ausgabe auf eine lokale Variable der Funktion main zeigt (was dann problematisch wird wenn die Daten innerhalb main weiter benutzt würden, oder wenn die Funktion zurückspringt, weil es eben nicht main ist sondern eine Unterfunktion).



  • Dieser Thread wurde von Moderator/in c.rackwitz aus dem Forum ANSI C in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Der Code-Vorschlag von LordJaxom wird fehlschlagen, da die struct in main vom Stack aquiriert wird und nach dem Verlassen von main nicht mehr gültig ist. Dieser Fehler kann durch Verwenden einer globalen Variablen umgangen werden, noch sauberer ist es, die Datenstruktur mit new oder malloc zu erzeugen und den Zeiger auf diese Struktur an den Thread zu übergeben. Der Thread muss dann die Datenstruktur nach Gebrauch zerstören, um memory-leaks zu vermeiden.



  • hat LordJaxom doch auch alles geschrieben.


Anmelden zum Antworten