Thread reagiert nicht auf Message

dezerver

Grünschnabel
Ich habe da ein kleines Problem mit meinem geliebtem Thema Threads...

ich habe einen Thread der bei ausführung eine Iteration ausführt, nun möchte ich diesen Thread aber auch gern beenden können bevor er damit fertig ist :)

Leider reagiert er nicht auf mein AfxEndThread(0); welches ich über eine Nachricht auslösen möchte, er ist wahrscheinlich zu sehr beschäftigt :confused:

Jetzt habe ich versucht in der Schleife eine Variablenabfrage zu implementieren (bei 1 mache weiter, bei 0 break-e bitte ab. Da das auch nicht funktionierte, rufe ich jetzt in der Schleife eine Funktion auf die mir den aktuellen Wert der Variable als int zurückgeben sollte. Das funktioniert auch soweit prima, zumindest wenn ich es aus dem Dialog aufrufe, rufe ich aus dem Thread die Funktion auf, ist die Variable nicht da... :mad:

Kurz ein Einblick in den Source:


int CPaintThread::StartPaint()
{
int i;
for(i = 0; i < 900; i = i++)
{
...mach was ...

// die statusvariable aus der funktion holen...
int paintStatus = ((SatellitentrackingDlg*)m_pParentDlg->FromHandle(m_pParentDlg->m_hWnd))->getPaintStatus();

if (paintStatus==0) {break;}
if (m_pParentDlg != NULL)
{
((SatellitentrackingDlg*)m_pParentDlg->FromHandle(m_pParentDlg->m_hWnd))->PaintSatellit(data, dataLength);
}

}

return 0;
}

//Die funktion die die Statusvariable zurückgibt

int SatellitentrackingDlg::getPaintStatus()
{
int test = paintStatus;
return(test);
}

Wenn ich paintStatus aus einer anderen Funktion (SatellitentrackingDlg) aufrufen, dann ist die Variable richtig gesetzt und funktioniert einwandfrei, aber aus CPaintThread klappt das nicht so recht,

Das ganze soll unter Windoofs mit C++/MFC geschehen.

Kann mir da vielleicht jemand helfen? Bin ein C++-Newbie :)
 
Zuletzt bearbeitet:
Die Compiler optimieren inzwischen etwas aggressiv.

Billiger Workaround: Versieh paintStatus mit dem Modifier "volatile". D.h. für den Compiler, die Variable kann sich unter seinem Hintern verändern, er soll also nicht davon ausgehen, dass die konstant bleibt.

Richtiger Workaround: Verwende ein Event für so etwas (CreateEvent). Diese sind speziel für solche threadübergreifenden Zugriffe gedacht.



... soll unter Windoofs mit ...

Werd erwachsen.
 
Problem erkannt, Problem gebannt.

Natürlich ist der Windowhandler überflüssig wenn man nicht zeichnen möchte.

CNOAA_SatellitentrackingDlg* noaa = ((CNOAA_SatellitentrackingDlg*)m_pParentDlg);
paintStatus = noaa->getPaintStatus();

Und schon klappt das ganze auch.

P.S.: Billiger Workaround reicht mir völlig aus, sonst wäre das ganze natürlich anders aufgebaut, der Zweck heilig die Mittel.

Und, ja Windoofs, auch wenn ich 40 bin werde ich ein Linuxkind sein und Windows nicht besonders mögen.
 
Zurück