Thread wie geht das?



  • Thr schrieb:

    Kann mir bitte jemand ein Beispiel für beginthread geben?
    Ich versuche damit verzweifelt ne Funktion aufzurufen...

    Das ist doch wohl lachhaft. Benutz google oder koders.com um Beispiele zu finden. Alternativ könntest du auch programmieren lernen.



  • Ich dachte das Forum wäre auch Newbie-freundlich, darum habe ich das
    hier gepostet. Entschuldigt, falls das hier nicht hingehört.
    Ich habe erst mit C++ angefangen (vor knapp 2 Wochen). 🙂

    Mir ist daher nicht so ganz klar wie ich beginthread verwenden soll.
    Besonders, wenn ich eine einfache void-Funktion damit aufrufen will.

    Muss man aber wohl mit Pointern innerhalb der Funktion arbeiten oder?



  • Thr schrieb:

    Kann mir bitte jemand ein Beispiel für beginthread geben?
    Ich versuche damit verzweifelt ne Funktion aufzurufen...

    Jop, hier: http://msdn2.microsoft.com/en-us/library/kdzttdcb.aspx



  • Hallo Codefinder!

    Ich kann damit also keine void-Funktion aufrufen richtig?

    _beginthread(lesson5, 0, 1); //lesson5 ist = void lesson5(void)
    

    '_beginthread': Konvertierung des Parameters 1 von 'void (void)' in 'void (__cdecl *)(void *)' nicht möglich

    Start address of a routine that begins execution of a new thread. For _beginthread, the calling convention is either __cdecl or __clrcall; for _beginthreadex, it is either __stdcall or __clrcall.

    Alles noch etwas böhmische Dörfer 🙄



  • Der Prototyp müsste:

    void __cdecl ThreadProc( void* pvData )
    

    sein.

    EDIT: was vergessen ("__cdecl")



  • hmm, ändert nichts an der Meldung. Ich verstehs net.



  • siehe EDIT, sorry



  • Ich fasse mal zusammen:

    Der Aufruf:

    _beginthread(ThreadProc,0,1);
    

    Die Funktion die gerufen wird:

    *.h

    void __cdecl ThreadProc( void* pvData );
    

    *.cpp

    void __cdecl ThreadProc( void* pvData )
    {
    MessageBox(0,"angekommen!",0,0);
    
    }
    

    Und das läuft bei dir 😕 Bei mir liegt wohl der Fehler im
    ersten Parameter vom Aufruf oder?



  • Hab nit getestet...

    Aber mal daran gedacht:

    * This program requires the multithreaded library.
    *
    * If you are using the Visual C++ development environment, select the
    * Multi-Threaded runtime library in the compiler Project Settings
    * dialog box.

    und daran:

    #include <process.h>    /* _beginthread, _endthread */
    

    Edit: Mist doppeltpost, einen löschen bitte 😮



  • Hab nit getestet...

    Aber mal daran gedacht:

    * This program requires the multithreaded library.
    *
    * If you are using the Visual C++ development environment, select the
    * Multi-Threaded runtime library in the compiler Project Settings
    * dialog box.

    und daran:

    #include <process.h>    /* _beginthread, _endthread */
    


  • Bei mir kommt die Fehlermeldung auch! Auch mit dem Include.



  • Zeig mal deinen Code.



  • Thr schrieb:

    Ich dachte das Forum wäre auch Newbie-freundlich, darum habe ich das
    hier gepostet. Entschuldigt, falls das hier nicht hingehört.
    Ich habe erst mit C++ angefangen (vor knapp 2 Wochen). 🙂

    Mit 2 Wochen C/C++-"Erfahrung" solltest du dich IMVHO nicht mit Threads rumschlagen...

    Thr schrieb:

    Muss man aber wohl mit Pointern innerhalb der Funktion arbeiten oder?

    Jein.

    Wenn du deinem Thread Daten übergeben willst kannst du das folgendermaßen bewerkstelligen:

    #include <stdio.h>
    #include <process.h>
    #include <windows.h>
    
    struct thread_data_t {
    
        int a;
        int b;
    };
    
    void __cdecl thread_proc( void *thread_data )
    {
        printf( "Die zwei Parameter, die ich bekommen habe, lauten %i und %i.\n",
                ( ( thread_data_t* )thread_data )->a,
                ( ( thread_data_t* )thread_data )->b );
    }
    
    int main( )
    {
        thread_data_t thread_data;
        thread_data.a = 10;
        thread_data.b = 20;
    
        _beginthread( thread_proc, 0, &thread_data );
    
        printf( "Ich wart' mal eine Sekunde...\n" );
        Sleep( 1000 );
    }
    

    Natürlich musst du dein Programm mit der Multithread-Version der CRT linken. Wie das geht verrät dir die Dokumentation deines Compilers.

    Greetz, Swordfish



  • das thread_data objekt sollte man aber in den meisten fällen auf dem heap anlegen.



  • Kann in einigen Fällen Sinn machen. Argumente?

    Greetz, Swordfish



  • In deinem Beispiel ist es sogar nötig oder du ändest es in Sleep(INFINITE);



  • wenn main() nach _beginthread() die thread_data nicht verändern will bzw. nicht von ihr abhängt ist's wurscht.

    Greetz, Swordfish



  • Es kann doch passieren das main() erst ganz durchläuft, auch wenn es bei einer Sekunde extrem unwahrscheinlich ist, und dann erst der erstellte Thread an die Reihe kommt. Dann ist der Inhalt der Variablen undefiniert.


Anmelden zum Antworten