Threads????



  • Man sollte unter Windows besser _beginthreadex benutzen.


  • Administrator

    Oder man benutzt boost::thread. Dann kannst du auch mehrere Parameter typsicher übergeben. Man kann dann sogar Objekte als "Funktion" (Funktor halt) übergeben.

    Es empfiehlt sich sowieso mal Boost anzuschauen 😉

    Ansonsten für alle WinAPI sachen, empfehle ich das WinAPI Forum und die MSDN.
    WinAPI: http://www.c-plusplus.net/forum/viewforum-var-f-is-4.html
    MSDN: http://msdn2.microsoft.com/de-de/library/default.aspx
    MSDN (CreateThread): http://msdn2.microsoft.com/de-de/library/ms682453.aspx

    Grüssli



  • hab das prob mit globalen variablen gelößt



  • bei meinem prog is ein neues prob, was jetzt nix mehr mit threads zu tun hat sondern eher mit der stdio.h:

    ich rufe die funktion auf:

    sprintf(buf2, "%s schreibt: %s\n",names[i],buf);
    

    Die Variablen existieren alle, aber in der buf2 steht nur drin:

    Name schreibt:
    

    Name is der inhalt von names[i], wenn ich die Funktion so aufrufe:

    sprintf(buf2, "schreibt: %s\n",buf);
    

    steht in buf2

    schreibt: (Der inhalt von buf)
    

    WHY???

    und was kann ich machen, dass in der buf2 drin steht:

    (Inhalt von names[i]) schreibt: (Inhalt von buf)
    


  • Für alle hier die CreateThread in C++ empfehlen:

    Böse Falle!

    Siehe: http://support.microsoft.com/?scid=kb%3Ben-us%3B104641&x=10&y=15


  • Administrator

    evilissimo schrieb:

    Für alle hier die CreateThread in C++ empfehlen:

    Böse Falle!

    Siehe: http://support.microsoft.com/?scid=kb%3Ben-us%3B104641&x=10&y=15

    Hmmm, danke für die Info. Muss ich mal ein paar meiner älteren Programme anschauen und allenfalls ein Update durchführen.

    Aber das ist dann wohl ein Grund mehr Boost zu benutzen 😃

    Allerdings, da geht es doch um die CRT, also C-Run-Time. Wenn man sich also an C++ hält, passiert nix?

    Edit: Noch was gesehen im Artikel

    APPLIES TO
    The C Run-Time (CRT), when used with:
    Microsoft Visual C++ 1.0 Professional Edition
    Microsoft Visual C++ 2.0 Professional Edition
    Microsoft Visual C++ 2.1
    Microsoft Visual C++ 2.2
    Microsoft Visual C++ 4.0 Standard Edition
    Microsoft Visual C++ 4.1 Subscription
    Microsoft Visual C++ 4.2 Professional Edition
    Microsoft Visual C++ 5.0 Standard Edition
    Microsoft Visual C++ 6.0 Service Pack 5

    Kommt also in 7.0, 7.1, 8.0 und 9.0 nicht mehr vor?

    @Yazoo,
    1. Neuer Thread aufmachen.
    2. Das ist eher C, als C++. In C++ solltest du es mal mit einem StringStream versuchen. Oder die Boost-Bibliothek verwenden ^^
    3. Das einzige was mir jetzt spontan einfallen würde: Ist buf2 gross genug?

    Grüssli



  • buf2 ist auf jeden fall groß genug,
    hier die deklarationen:

    char buf[256];
    char buf2[301];
    std::string names[MAX_CLIENTS];   //in jedes names objekt des strings kommen max 44 zeichen
                                      // MAX_CLIENTS ist in diesem fall als 10 definiert
    

    buf2 muss leider char sein, da ich das später mit nem TCP Socket verschicken möchte. Normalerweise armeite ich nur mit std::string in der string.h



  • der fehler is extrem strange ich habe grade ma ausprobiert was er macht wenn ich die reihenfolge der variablen vertausch also:

    sprintf(buf2, "%s schreibt: %s\n",buf,names[i]);
    

    jetzt steht in buf2:

    (inhalt von buf) schreibt: (inhalt von names[i])
    

    HHHHHHÄÄÄÄÄÄ?????????

    Wieso, das ergibt doch keinen sinn, dass es in dieser Reihenfolge funtzt und in der anderen nicht!!!



  • es gingen bis jetzt alle davon aus, dass names[i] ebenfalls ein C-string ist.
    du kannst an (s)printf keine std::strings übergeben, das erzeugt nämlich schlicht und einfach undefiniertes verhalten. verwende names[i].c_str() - oder steig gleich ganz auf std::strings um. wenn du die daten nur versendest, sollte ein konstanter C-string reichen (den liefert dir std::string::c_str()), willst du daten empfangen, kannst du diese in einen std::vector<char> speichern (der groß genug ist, sie zu fassen).



  • vielen, vielen dank, das wusste ich noch nicht.


Anmelden zum Antworten