Seltsamer Effekt bei einem Doc/View Projekt

LordTerra

Mitglied
moin

ich wollte mal fragen woran folgendes Problem liegen könnte bzw wie man es beheben könnte:

Ich habe ein Doc/View Projekt zur Steuerung industrieller Drucker der Firma Wolke / APS / REA geschrieben ... In diesem Projekt werden erstellten Labels Track & Trace Daten zugewiesen und sobald der Drucker meldet das er gedruckt hat werden neue Daten aus der Datenbank abgeholt und an den Drucker gesendet ... soweit funktioniert auch alles

ich habe ein paar threads die die Drucker steuern / nen Command Thread der auf der Datenbank horcht und halt eine Oberfläche die die gesandeten Daten anzeigt...

Wie gesagt funktioniert alles...

mein Problem:
wenn der Thread für die Druckersteuerung noch läuft und ich über die Oberfläche das Programm beende verabschiedet sich die Oberfläche (sie hängt sich auf)

mein beenden läuft wie folgt:
-> ich beende die laufenden Threads
-> warte auf das Flag das mir sagt = Druckthread beendet
(Dauert zwischen 3 und 25 sec je nach Drucker)
-> beende Datenbankverbindung
-> lösche meine Arrays
-> und beende das Projekt

Dies alles passiert in der OnAppExit()

wenn ich diese Reihnfolge einhalte hängt sich die Oberfläche auf
das seltsame ist aber : wenn ich beim warten auf das Flag eine AfxMessageBox ausgeben
dann hängt sich die Oberfläche nicht auf und ich kann ganz normal mein Projekt beenden

Code:
void CMainFrame::OnAppExit(){
	// TODO: Code für Befehlsbehandlungsroutine hier einfügen
	if(db_con->DBConOK){
		db_con->DBUpdateAbmeldung();
	}

	druckerReady = TRUE;
	druckJob=FALSE;
	commandServer=FALSE;
	startet=FALSE;

	int i=0;
	do{
		Sleep(1000);
		AfxMessageBox("Ende");
		if(i>=2){
			break;
		}
		i++;
	}while(ending!=TRUE);

	delete [] db_con->obj;
	if(db_con->DBConOK){
		db_con->DBCloseNow();
	}
	delete db_con;

	if(writeDefaultFile()){
		delete label1;
		delete label2;
		delete label3;
		delete label4;
		delete label5;
		delete label6;
		delete label7;
		delete errorFeld;
		delete ipfeld;
		delete dj;
		delete dbv;
		delete config;
		delete txt;
	}
	SendMessage(WM_CLOSE);
}

^^ also wenn ich die AfxMessageBox weg lasse funktioniert das beenden nicht richtig...
wieso ist das so ? was kann man dagegen machen ?

hat da jemand eine idee?

mfg LT
 
Ich würde sagen, du musst evtl. noch den Messageloop am Laufen halten. AfxMessageBox erledigt das indirekt.
Bau statt dessen da mal AfxPumpMessage rein.
 
Einfach aufrufen, das beinhaltet im Grunde das, was DoEvents für VB macht. Es holt eine Nachricht aus der Queue und bearbeitet sie. Sinnvollerweise in einer Schleife aufrufen.

Es wird wohl empfohlen, das über CWinThread::pumpMessage zu machen, AfxPumpMessage ist die interne Variante. Ich muss aber sagen, dass ich damit bisher immer gut gefahren bin.
 
also ich hab jetzt
Code:
if( PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE ) ) {
            GetMessage( &msg, 0, 0, 0 );
            TranslateMessage( &msg );
            DispatchMessage( &msg );
}

benutzt... das stammt ja auch von dir nur aus nem anderen thread
damit geht es ...

ich dank dir

mfg LT
 

Neue Beiträge

Zurück