Thread (Wie bekomme ich das hin?)



  • @ sovok
    Ja. Hab ich auch schon versucht. Dann wiederum gibt es hier einen Fehler...

    UINT CAbfrage::Watch( LPVOID pParam )
    {
    ==>	ThreadParam Param = (ThreadParam) pParam;
    //...
    	for(int i=0;i<32;i++)
    	Param->pInteraktion.m_iAktuell[i] = 1 ;//0 + ( rand() % (1 - 0 + 1));
    //...
    

    ... und zwar diesen. ==>
    error C2440: 'type cast' : 'void *' kann nicht in 'struct ThreadParam_' konvertiert werden

    Wenn ich das jetzt auch verändere in:

    UINT CIOAbfrage::WatchIO( LPVOID pParam )
    {
    	ThreadParam* Param = (ThreadParam*) pParam;
    		for(int i=0;i<32;i++)
    		Param->pInteraktion->m_iAktuell[i] = 1 ;//0 + ( rand() % (1 - 0 + 1));
    

    Dann hab ich zwar keinen einzigen Fehler mehr, aber ich bekomme einen ganz fiesen Fehler beim Ausführen.



  • natürlich bekommst du einen fiesen fehler beim ausführen
    der code is aber richtig

    ThreadParam *Param = (ThreadParam*) pParam; //threadfunktion
    zeigt auf
    ThreadParam param; //LesePermanent() funktion

    was passiert mit
    ThreadParam param; //LesePermanent() funktion
    wenn du die funktion fertig durchlaufen hast?

    für ne richtige antwort bekommst du die lösung 😉



  • Mit durchlaufen der Funktion endet mein Gültigkeitsbereich!
    ??????



  • richtig
    das bedeutet
    ThreadParam param; //LesePermanent() funktion
    wird gelöscht und
    ThreadParam *Param = (ThreadParam*) pParam; //threadfunktion
    zeigt auf ein objekt das nicht mehr existiert

    lösung: mach ThreadParam param; zu ner membervariable von CAbfrage



  • Ich bin ja glücklich, das ich (mit deiner hilfe) gesehen hab das der Gültigkeitsbereich endet, aber jetzt steh ich auf dem Schlauch.

    Hab ich das richtig verstanden?
    Ich soll im CAbfrage eine membervariable z.B. m_tp vom typ ThreadParam_ anlegen?
    Und dann? 😕



  • ne natürlich in der CInteraktion, sorry



  • hab ich gemacht. Wie es aussieht aber mal zur abwechslung Falsch. 😞
    muß doch nur die Variable "m_tp" da einsetzen wo vorher param stand, oder.

    Jedenfals ging es so nicht und ich habe es wieder zurückgeändert, wobei ich jetzt angeblich einen Fehler in der Struktur habe und eine Neudefinition und noch 17 weitere Fehler.
    Muß erstmal schauen, woran das liegt.



  • warum ging es so nich?



  • Ich habe die Struktur

    typedef struct ThreadParam_
    { 
     CInteraktion* pInteraktion;
     CIOAbfrage* pAbfrage;
    }ThreadParam;
    

    In eine Extra Haeder Datei. "Struktur.h"
    Diese habe ich dann jeweils in "Interaktion.cpp" und in der "Abfrage.cpp" eingebunden.
    Aus irgendeinen Grund stand das aufeinmal in der "Abfrage.h".

    #include "Struktur.h"	// Hinzugefügt von der Klassenansicht
    

    Das gab nen crash.
    -----
    Was soll ich nun machen? die Membervariable kann ich knicken, weil die Struktur bis dahin unbekannt ist.
    Und wenn ich si vorher einbinde gibt es wieder nen crash



  • ich benutz keine structs
    also mach mal aus der struct ne klasse

    class ThreadParam
    {
    public:
    CInteraktion* pInteraktion;
    CIOAbfrage* pAbfrage;
    };

    binde den header in die cpps ein und in den anderen headern schreibst du nur class ThreadParam;

    #ifndef
    #define

    #endif
    nich vergessen

    dann probiers nochmal



  • (Schade das du keine Strukturen nutzt. Ich fand den Ansatz von Rapha gut.)

    Alles gemacht! jetzt ist nurnoch die Klasse nicht definiert.

    error C2079: 'm_tp' verwendet undefiniertes class 'ThreadParam'

    habe aber "class ThreadParam;" vor die Klasse geschrieben.
    Liegt es an der Klasse selbst? Wußte nicht was ich hier schreiben sollte:

    #ifndef ...
    #define ...

    #endif

    Bei mir sieht es so aus. (Struktur.h)

    #ifndef ThreadParam
    #define run
    
    class ThreadParam
    { 
    public:
     CInteraktion* pInteraktion;
     CIOAbfrage* pAbfrage;
    };
    
    #endif
    


  • #ifndef _H__ThreadParam__H_ //falls dieser header noch nich eingebunden wurde
    #define _H__ThreadParam__H_ //binde ihn jetzt ein

    class ThreadParam
    {
    public:
    CInteraktion* pInteraktion;
    CIOAbfrage* pAbfrage;
    };

    #endif //andernfalls überspringe ihn

    wenn du das nich machst kann es sein, dass du den mehrfachdeklaration-fehler bekommst

    ausserdem musst du den header mit #include in die cpp files einbinden

    bzgl. error C2079: 'm_tp' verwendet undefiniertes class 'ThreadParam'
    d.h. dass du auf membervariablen oder memberfunktionen zugegriffen hast ohne vorher den header einzubinden

    class cBlah;
    cBlah einBlah;// OK
    einBlah.func();//Fehler
    #include "cBlah.h"
    einBlah.func();//OK



  • In die beiden cpp's hab ich sie schon eingebunden (Interaktion.cpp , Abfrage.cpp)

    Soll es auch in die StdAfx.cpp ?

    Außerdem hab ich wie du es sagtest "class ThreadParam;" direkt vor die Klassendefinitionen in (Interaktion.h , Abfrage.h) geschrieben.
    Gibt natürlich auch einen Fehler.

    error C2079: 'm_tp' verwendet undefiniertes class 'ThreadParam'

    Ich glaub wenn das gelöst ist sollte es gehen.



  • ne in die StdAfx muss es nich
    was passiert wenn du statt "class ThreadParam;" den header einbindest?



  • Ein Fehler in meiner Klasse. ---EDIT + weiter 15

    class ThreadParam
    { 
    public:
     CInteraktion* pInteraktion;   <====
     CIOAbfrage* pAbfrage;
    };
    

    error C2143: Syntaxfehler : Fehlendes ';' vor '*'

    ---EDIT
    Bei der anderen Variante hatte ich nur 5 Fehler.



  • schreib mal in deinen ThreadParam header nach dem #define

    class CInteraktion;
    class CIOAbfrage;

    jetzt müssts aber langsam mal gehn oder?



  • 😃
    Es Geht. Glaub ich zumindest. Es wird zwar noch nicht das gemacht was ich will, aber es läuft wie es aussieht.

    Vielen Dank.

    Kann ich noch irgendwie überprüfen ob der Thread läuft?
    Außer Debug?



  • mach halt irgendwas in der watch funktion
    MessageBox("test");



  • Ich glaub jetzt ist das schlimmste passiert was geht!
    Kein Fehler, aber es klappt nicht.

    Was jetzt?
    Mein Thread ändert die Variable (m_iAktuell[]) einfach nicht.
    Die MessageBox geht im übrigen garnicht. bekomme dann einen Fehler:

    'MessageBoxA' : Funktion akzeptiert keine 1 Parameter

    Ist aber Korrekte Syntax. Hab es von einer anderen stelle des Programms einfach kopiert.

    Mit MessageBeep(0); gibt es keinen Fehler, aber es gibt auch keinen Beep.



  • dann halt
    MessageBox(NULL,"test","test",MB_OK);

    und schaum mal ob dein handle nach der create funktion == NULL is


Anmelden zum Antworten