tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von Endurion
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
586
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    LordTerra LordTerra ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    31
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    
    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
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Ich würde sagen, du musst evtl. noch den Messageloop am Laufen halten. AfxMessageBox erledigt das indirekt.
    Bau statt dessen da mal AfxPumpMessage rein.
     

  3. #3
    LordTerra LordTerra ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    31
    AfxPumpMessage ? ok hab ich noch nie gehört ...
    was is n das bzw wie wendet man sie an ?
     

  4. #4
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    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.
    LordTerra bedankt sich. 

  5. #5
    LordTerra LordTerra ist offline Mitglied Bronze
    Registriert seit
    Jul 2007
    Beiträge
    31
    also ich hab jetzt
    Code :
    1
    2
    3
    4
    5
    
    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
     

Ähnliche Themen

  1. Plugins entwickeln. Text bei einem View bearbeiten********
    Von daniel38 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 19.11.10, 12:21
  2. von einem c++ projekt auf ein c projekt zu greifen
    Von sponge_bob im Forum VisualStudio & MFC
    Antworten: 0
    Letzter Beitrag: 19.05.06, 21:20
  3. Select into aus einem View
    Von GartenUmgraben im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 23.11.05, 18:45
  4. Eine Funktion in einem anderen View aufrufen
    Von Thopeto im Forum VisualStudio & MFC
    Antworten: 6
    Letzter Beitrag: 16.02.05, 14:30
  5. Antworten: 4
    Letzter Beitrag: 28.07.03, 12:17