Grosses Thread problem (AfxBeginThread). Bitte um Hilfe
-
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.