Grosses Thread problem (AfxBeginThread). Bitte um Hilfe



  • also wenn das war ist dann bin ich in ein paar tagen fertig und könnte dich abk..tschen 😃

    vielen dank für deine hilfe



  • also ich hab ein bool verwendet. Wird dieser auf true gesetzt soll der Thread geschlossen werden. Jedoch bekomme ich probleme beim kompilieren.

    Initialisierung:

    public:
          bool m_TerminateThread;
    
    protected: 
          	// thread
    	CWinThread*			m_Thread;
    

    Jedoch beim Aufruf bekomme ich beim compilieren probleme und hab keine Ahnung warum.

    Diesen Code habe ich am Anfang der endless loop Schleife geschrieben

    if (m_TerminateThread)
    {
    	DWORD m_ThreadExitCode;
    	GetExitCodeThread(m_Thread,m_ThreadExitCode);
    	AfxEndThread(m_ThreadExitCode,true);
    	return 0;
    }
    

    und bekome folgende Fehlermeldung:
    c:\Dokumente und Einstellungen\Mother\Eigene Dateien\Visual Studio-Projekte\Kasse\Kasse\SerialPort.cpp(237): warning C4551: Dem Funktionsaufruf fehlt die Argumentliste
    c:\Dokumente und Einstellungen\Mother\Eigene Dateien\Visual Studio-Projekte\Kasse\Kasse\SerialPort.cpp(555): warning C4267: 'Argument' : Konvertierung von 'size_t' nach 'DWORD', Datenverlust möglich
    c:\Dokumente und Einstellungen\Mother\Eigene Dateien\Visual Studio-Projekte\Kasse\Kasse\SerialPort.cpp(240): error C2597: Ungültiger Verweis auf nicht-statischen Member 'CSerialPort::m_Thread'
    c:\Dokumente und Einstellungen\Mother\Eigene Dateien\Visual Studio-Projekte\Kasse\Kasse\SerialPort.cpp(237): error C2597: Ungültiger Verweis auf nicht-statischen Member 'CSerialPort::m_TerminateThread'

    Kann du mir hier noch helfen ??



  • also ich hab ein bool verwendet. Wird dieser auf true gesetzt soll der Thread geschlossen werden. Jedoch bekomme ich probleme beim kompilieren.

    Initialisierung:

    public:
          bool m_TerminateThread;
    
    protected: 
    
           CWinThread*			m_Thread;   [B]// thread[/B]
    
            static UINT	CommThread(LPVOID pParam);  [B]//Thread Funktion [/B]
    

    Jedoch beim Aufruf bekomme ich beim compilieren probleme und hab keine Ahnung warum.

    Diesen Code habe ich am Anfang der endless loop Schleife geschrieben

    if (m_TerminateThread)  [B]//1. Error bekomme ich hier[/B]
    {
    	DWORD m_ThreadExitCode;
    	GetExitCodeThread(m_Thread,m_ThreadExitCode);  [B]//2. und 3. Error erscheint hier[/B]
    	AfxEndThread(m_ThreadExitCode,true);
    	return 0;
    }
    

    und bekome folgende Fehlermeldung:
    c:\Dokumente und Einstellungen\Mother\Eigene Dateien\Visual Studio-Projekte\Kasse\Kasse\SerialPort.cpp(237): warning C4551: Dem Funktionsaufruf fehlt die Argumentliste
    c:\Dokumente und Einstellungen\Mother\Eigene Dateien\Visual Studio-Projekte\Kasse\Kasse\SerialPort.cpp(555): warning C4267: 'Argument' : Konvertierung von 'size_t' nach 'DWORD', Datenverlust möglich
    c:\Dokumente und Einstellungen\Mother\Eigene Dateien\Visual Studio-Projekte\Kasse\Kasse\SerialPort.cpp(240): error C2597: Ungültiger Verweis auf nicht-statischen Member 'CSerialPort::m_Thread'
    c:\Dokumente und Einstellungen\Mother\Eigene Dateien\Visual Studio-Projekte\Kasse\Kasse\SerialPort.cpp(237): error C2597: Ungültiger Verweis auf nicht-statischen Member 'CSerialPort::m_TerminateThread'
    c:\Dokumente und Einstellungen\Mother\Eigene Dateien\Visual Studio-Projekte\Kasse\Kasse\SerialPort.cpp(240): error C2664: 'GetExitCodeThread' : Konvertierung des Parameters 2 von 'DWORD' in 'LPDWORD' nicht möglich

    Kann du mir hier noch helfen ??



  • also ich hab ein bool verwendet. Wird dieser auf true gesetzt soll der Thread geschlossen werden. Jedoch bekomme ich probleme beim kompilieren.

    Initialisierung:

    public:
          bool m_TerminateThread;
    
    protected: 
    
           CWinThread*			m_Thread;   [B]// thread[/B]
    
            static UINT	CommThread(LPVOID pParam);  [B]//Thread Funktion [/B]
    

    Jedoch beim Aufruf bekomme ich beim compilieren probleme und hab keine Ahnung warum.

    Diesen Code habe ich am Anfang der endless loop Schleife geschrieben

    if (m_TerminateThread)  [B]//1. Error bekomme ich hier[/B]
    {
    	DWORD m_ThreadExitCode;
    	GetExitCodeThread(m_Thread,m_ThreadExitCode);  [B]//2. und 3. Error erscheint hier[/B]
    	AfxEndThread(m_ThreadExitCode,true);
    	return 0;
    }
    

    und bekome folgende Fehlermeldung:
    warning C4551: Dem Funktionsaufruf fehlt die Argumentliste
    warning C4267: 'Argument' : Konvertierung von 'size_t' nach 'DWORD', Datenverlust möglich
    error C2597: Ungültiger Verweis auf nicht-statischen Member 'CSerialPort::m_Thread'
    error C2597: Ungültiger Verweis auf nicht-statischen Member 'CSerialPort::m_TerminateThread'
    error C2664: 'GetExitCodeThread' : Konvertierung des Parameters 2 von 'DWORD' in 'LPDWORD' nicht möglich

    Kann du mir hier noch helfen ??



  • Die bool-Variable muss global sein. Oder statisch.
    Dann ist deine if-Anweisung ziemlich sinnlos.
    Du musst das IN die endlosschleife einbauen:

    ...
    for(;!m_TerminateThread;)
    {
        ...
    }
    return 0;
    

    Ebenso Ist das GetExitCodeThread sinnlos, die Funktion gibt STILL_ACTIVE zurück, wenn der Thread noch läuft (kannst du der MSDN entnehmen)
    Und AfxEndThread ist auch nicht nötig, da der Thread beendet ist, wenn die Threadfunktion zurückkehrt.

    Wie sieht der Code aus, wegen dem du die erste Warnung bekommst (Z. 237)?



  • hmm alles klar. Ich hatte mir eigentlich schon gedacht wenn ich einfach eine return Anweisung mache müsste der Thread ja auch geschlossen werden. Jedoch dachte ich das AfxEndThread noch etwas besonderes macht.

    Hab jetzt alles entfernt und nur

    static bool m_TerminateThread;

    als public initialisiert. Bekomme jedoch dann wiederum eine Fehlermeldung welche folgendermassen lautet.

    Kasse error LNK2001: Nichtaufgeloestes externes Symbol "public: static bool CSerialPort::m_TerminateThread" (?m_TerminateThread@CSerialPort@@2_NA)
    Kasse error LNK2001: Nichtaufgeloestes externes Symbol "public: static bool CSerialPort::m_TerminateThread" (?m_TerminateThread@CSerialPort@@2_NA)
    Kasse error LNK2001: Nichtaufgeloestes externes Symbol "public: static bool CSerialPort::m_TerminateThread" (?m_TerminateThread@CSerialPort@@2_NA)

    Was heisst hier Nichtaufgelöstes externes Symbol ? Im Konstruktor wird die m_TerminateThread auf false gesetzt. Irgendwann wird die im Ablauf dann auf true gesetzt, welches natürlich denn Thread dann beenden soll.



  • Du musst statische Variablen auch "statisch" initialisieren:

    static bool CSerialPort::m_TerminateThread = false
    

    in der cpp-Datei.



  • sorry ich hab noch nie mit statischen variablen gearbeitet. Jetzt bekomme ich eine neue Fehlermeldung wenn ich die zeile einfüge.

    static bool CSerialPort::m_TerminateThread = false;

    Ich hab diese Zeile jetzt vor the endless for schleife eingefügt bzw. auch im Konstruktor probiert, geht leider immer noch nicht 😞 Wo genau muss ich die Zeile einfügen ?



  • Ne, das packst du eifnach an den Anfang der cpp-Datei direkt nach dem include der Header.



  • jo hatte ich mir gedacht und auch vor kurzem ausprobiert, bekomme dann die folgende Fehlermeldung

    error C2720: 'CSerialPort::m_TerminateThread' : 'CSerialPort::' Speicherklassenspezifizierer für Elemente unzulässig

    denn hatte ich noch nie :)und unter public in der Hauptklasse steht

    static bool m_TerminateThread



  • Hö? Klappt es, wenn du das static in der cpp-Datei weglässt?



  • yup es geht... jetzt muss ich probieren ob ich denn com port überwachen kann d.h. ob ich die Überwachung für das Hauptdialog deaktiviere und dann für denn 2.ten Dialog wieder aktiviere.



  • also ich hab jetzt 2 Varianten ausprobiert. Aber irgendwie wird der Thread nicht beendet d.h. er scannt immer noch im Hauptdialog am ComPort.

    einmal

    for(;!m_TerminateThread;)
    {
    .....
    }

    dann auch

    for(;!m_TerminateThread;)
    {
    if(m_TerminateThread)
    return 0;
    }

    und es funktioniert leider nicht. Kurz bevor ich denn 2. Dialog aufrufe setzte ich dich Variable m_TermninateThread = true jedoch es tut sich nichts :(. Muss AfxEndThread benutzen ?

    oder kann ich die statische Variable nicht true setzten. Sie ist ja nicht const. Hab ein stop für debug an return gesetzt jedoch wird dieser nicht aufgerufen :(.

    Hab die Klasse für die Überwachung des ComPorts ja in mein Hauptprogramm includiert und eine Object erzeugt

    protected:
    CSerialPort m_Ports;

    und setzte m_TerminatedThread so auf true

    m_Ports.m_TerminatedThread = true;

    Danach brauch ich doch nichts mehr aufzurufen, der Thread müsste doch sich beenden da ja Return aufgerufen wird oder ?



  • Ich denke es liegt an dem WaitForComEvent, der warte ja, wie der name shcon sagt ...



  • ja aber dieses WaitComEvent müsste doch beendet werden wenn der Thread beendet wird. Aber der Thread wird ja nie beendet

    Wie kann ich jetzt bloss das WaitComEvent abschalten.

    Das problem will sich nicht beheben lassen 😞



  • Hm, ne. Den Kommentaren nach zu urteilen ist der folgende der Code, der den Thread blockiert:

    // Main wait function.  This function will normally block the thread 
            // until one of nine events occur that require action. 
            Event = WaitForMultipleObjects(3, port->m_hEventArray, FALSE, INFINITE);
    

    Du könntest zum Beispiel diese Zeile in eine Schleife stecken, die abbricht, wenn ein bestimmtes Event eingetreten ist oder eben die Abbruchvariable gesetzt wird. Dass das funktioniert musst du natürlich den letzten Parameter von INFINITE auf wenige ms setzen.


Anmelden zum Antworten