Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Variablen und Programme.

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
07.10.2004, 12:43 Uhr
Mr. T



Hallo!!

Also, da ich ja noch nicht sonderlich C++ fähig bin, möchte ich gerne wissen, ob ich mit meinen Klassen in einem Programm, das ich irgendwann beende und dann wieder neu starte möglicherweise Speicherleichen verursache!?

Es werden eine Menge protected Variablen geschrieben und geändert.

Oder werden die Speicherinhalte wieder freigegeben, wenn ich die Konsolenanwendung beim nächsten mal starte?

UND:

Wie wird ein Programm mit microsoft visual c/c++ so geschrieben, dass es kein Fenster öffnet? Ich wollte es stets im Hintergrund laufen lassen, im Vordergrund muss ein anderes Programm laufen...

DANKE
--
So ist das!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.10.2004, 12:56 Uhr
ao

(Operator)


Wenn du dynamisch Speicher anforderst (mit malloc für C-Programmierer oder new für C++-Leute) und diesen nicht wieder freigibst (mit free bzw. delete), hast du ein Speicherleck, sonst nicht.

Protected hat damit nichts zu tun.

Ordentliche Betriebssysteme machen es meist so, dass beim Beenden eines Programms auch sämtlicher Speicher, den das Programm belegt hatte, aufgeräumt wird. Speicherlecks sind dann nur wirksam, bis das verursachende Programm beendet wird.

Aber darauf kann man sich nicht verlassen, und es ist immer besser, Speicherlecks zu finden und zu stopfen. Bei Programmen, die stets im Hintergrund laufen, ist das besonders wichtig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.10.2004, 12:56 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

@Speicherleichen: Solange Du Variablen entweder z.B: per

C++:
class Test {};
...
Test x();


anlegst, oder per new angelegte wieder mit delete freigibst, hast Du keine Memory Leaks.

@Fensterlos: Du kannst Dein Programm beim Aufruf von ShowWindow(...) mit dem Parameter SW_HIDE verstecken. MFC oder API?
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.10.2004, 11:01 Uhr
Mr. T




Zitat von Bruder Leif:

@Fensterlos: Du kannst Dein Programm beim Aufruf von ShowWindow(...) mit dem Parameter SW_HIDE verstecken. MFC oder API?


Uff!

Danke Ihr 2!! Also mache ich mir um den Speicher keine Sorgen mehr...

Mit dem Fenster weiß ich ehrlichgesagt nicht. Ich in eine win Konsolenanwendung hineinprogrammiert, weil ich nur davon während dem Studium was beigebracht bekommen habe. Gibts da vielleicht was anderes? Was genau ist mfc bzw api?

Dann hätte ich jetzt eine neue Frage, zunächst der Code:


C++:
#define MAKEWOR(A,B) ( ((A)<<8) + (B)))

#include "stdafx.h"


HANDLE h_com1_Bus = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0 , NULL);
//HANDLE h_com2_Bus = CreateFile("COM2", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0 , NULL);

void Com1Ini()
{
////////////////////////////////COM1////////////////////////////////////

    DCB com1_Einstellungen;
    COMMTIMEOUTS com1_HorchZeit;
    
    com1_Einstellungen.BaudRate = 115200;
    com1_Einstellungen.ByteSize = 8;
    com1_Einstellungen.Parity   = MARKPARITY;
    com1_Einstellungen.StopBits = ONESTOPBIT;
    
    SetCommState(h_com1_Bus, &com1_Einstellungen);
    GetCommState(h_com1_Bus, &com1_Einstellungen);



    com1_HorchZeit.ReadTotalTimeoutConstant=0;
    com1_HorchZeit.ReadTotalTimeoutMultiplier=0;

    SetCommTimeouts(h_com1_Bus,&com1_HorchZeit);
    GetCommTimeouts(h_com1_Bus,&com1_HorchZeit);
}


//////////////////////COM2////////////////////////////////////////////

void Com2Ini()
{
    DCB com2_Einstellungen;
    COMMTIMEOUTS com2_HorchZeit;

    com2_Einstellungen.BaudRate = 9600;
    com2_Einstellungen.Parity = NOPARITY;
    com2_Einstellungen.StopBits = ONESTOPBIT;
    com2_Einstellungen.ByteSize = 4;

    SetCommState(h_com2_Bus, &com2_Einstellungen);
    GetCommState(h_com2_Bus, &com2_Einstellungen);

    com2_HorchZeit.WriteTotalTimeoutConstant = 0;
    com2_HorchZeit.WriteTotalTimeoutMultiplier = 0;

    SetCommTimeouts(h_com2_Bus, &com2_HorchZeit);
    GetCommTimeouts(h_com2_Bus, &com2_HorchZeit);
}

void StartPunkt()
{
    unsigned long    com1_ZuSchreibendeBytes, com1_GeschrBytes,
                    com1_GelesBytes;//, com2_GelesBytes;

    char com1_ZuSchreiben[1], com1_Gelesen[7];//, com2_Gelesen[1];

    com1_ZuSchreiben[0] = 0x01;
    com1_ZuSchreibendeBytes = 1;
    
    
    for(;;)
    {    
        //Mit Signal von SPS starten
        ReadFile(h_com2_Bus, &com2_Gelesen, 1, &com2_GelesBytes, NULL);
        if(com2_Gelesen[0]==0x01)
        {break;}
    }

    for(;;)
    {
        //Token an Adresse 0x01 schicken (Laser)
        WriteFile(h_com1_Bus, &com1_ZuSchreiben, com1_ZuSchreibendeBytes, &com1_GeschrBytes, NULL);
        ///Startindex finden. Beim Nulldurchgang des Gebers sind die////
        ////[3] & [4] beide 0x00. Kann nicht exakt getroffen werden,////
        ////////also dieses kleine Fenster von 0x0000 - 0x000A//////////
        ReadFile(h_com1_Bus, &com1_Gelesen, 8, &com1_GelesBytes, NULL);
        if(com1_Gelesen[3]==0x00  && com1_Gelesen[4]<=0x0A)
        {break;}//Fenster getroffen!-->Starten!
    }

}


bool MesswertAufnahme()
{
    char    Messwerte[4000], Winkelwerte[4000],
            com1_ZuSchreiben[1], com1_Gelesen[7];

    unsigned long    com1_ZuSchreibendeBytes, com1_GeschrBytes,
                    com1_GelesBytes;

    int    t = 0;

    com1_ZuSchreiben[0] = 0x01;

    com1_ZuSchreibendeBytes = 1;

    for(t=0;t<4000;t++)
    {
        Messwerte[t] = 0x01;
        Winkelwerte[t] = 0x01;
    }

    for(t=0;t<2000;t++)        //Start der Messwertaufnahme
    {
    
        //Token an Adresse 0x01 schicken (Laser)
        WriteFile(h_com1_Bus, &com1_ZuSchreiben, com1_ZuSchreibendeBytes, &com1_GeschrBytes, NULL);

        /////Teilnehmer 0x01 sendet jetzt Daten, einlesen von 7Bytes://///
        //////[0]=Wert,[1]=Wert,[2]=Token der an Teilnehmer als Folge/////
        ///Teilnehmer eingestellt ist. Hier 0x02, der Inkrementalgeber.///
        ///////[3]=WertA, [4]=WertB, [5]=Token. Ende des Comkreises///////
        ReadFile(h_com1_Bus, &com1_Gelesen, 8, &com1_GelesBytes, NULL);

        /////Wenn das dritte Byte nicht das Token 0x02 ist, Fehler!/////
        /////Wenn das fünfte Byte nicht das Token 0x03 ist, Fehler!/////
        if(com1_Gelesen[2]!=0x02 || com1_Gelesen[5]!=0x03)
        {        
            cout<<"\nCom Fehler\n"
            <<"Gelesen wurde : "
            <<com1_Gelesen[0]
            <<com1_Gelesen[1]
            <<com1_Gelesen[2]
            <<com1_Gelesen[3]
            <<com1_Gelesen[4]
            <<com1_Gelesen[5]
            <<com1_Gelesen[6]
            <<com1_Gelesen[7]
            <<"-->Fehler"
            <<endl;
            return (false);
        }

//////////////////Speichern der 0x Werte//////////////////////////
        else
        {
            Messwerte[2*t] = com1_Gelesen[0];
            Messwerte[2*t+1] = com1_Gelesen[1];
            Winkelwerte[2*t] = com1_Gelesen[3];
            Winkelwerte[2*t+1] = com1_Gelesen[4];
        }

    }

    CloseHandle(h_com1_Bus);
             CloseHandle(h_com2_Bus);
}
double i, j;

    for(t=0;t<2000;t++)
    {
////////////Wenn Ausserhalb des Messbereichs, Fehler!!//////////
        if(Messwerte[t]>=0xFF && Messwerte[t+1]>=0xFE)
        {
            cout<<"\nMessbereich verlassen, Fehler\n"
            <<"Gelesen wurde : "
            <<Messwerte[t]
            <<Messwerte[t+1]
            <<Winkelwerte[t]
            <<Winkelwerte[t+1];
            return (false);
        }

/////Wenn kein Fehler vorliegt, werden Messwerte geschrieben/////
        else
        {
            //Radius gür AlleWerte[] Feld
            i = MAKEWORD(Messwerte[2*t+1], Messwerte[2*t]);
            i = (i - 2768) * 70 / 60000 + 28;
        
            cout<<t<<"\t"
            <<"DEZ: "<<i
            <<(i-2768)*70/60000+28
            <<"\t";
        
            j = MAKEWORD(Winkelwerte[2*t+1], Winkelwerte[2*t]);
        }
    }
    return (true);
}

void main()
{
    Com1Ini();        //Definieren der Schnitstelle

    Com2Ini();        //Definieren der Schnitstelle
    
    StartPunkt();                //Start der Messung erwarten

    MesswertAufnahme();        //Messen Starten und speichern

}




Also: was könnte mein Problem sein, dass manchmal die Kommunikation zwischen mir und meinen Teilnehmern nicht funzt?
Nur selten passiert es, dass ich eine 0x01 sende (writefile mit Erfolg) und dann bleibt mein programm im readfile() stecken, und bekommt also keine Antwort. An den Teilnehmern liegt es bestimmt nicht, das kann ich ausschliessen!
Dann probiere ich alles mögliche aus mit ändern der zu lesenden bytes, runterfahren, hochfahren, andere Versionsstände dieses Programmes und irgendwann funzt es dann wieder...
Die couts sind gerade nur zum kontrollieren mit drinnen...
Danke!!
--
So ist das!

Dieser Post wurde am 08.10.2004 um 11:05 Uhr von Mr. T editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: