Speicher voll??? DRINGEND!!!
-
Was stellen Leute die nicht helfen und nur meckern blöde Fragen?
Ach ja, siehe deine Signatur...
-
Hast Du mal überlegt warum Dir nicht geholfen wird?
MfG
-
@Teaser
Du musst ja denken, wir wollen nicht helfen!Dein Code:
void CAKLTestumgebungView::OnDraw(CDC* pDC) { CAKLTestumgebungDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); // ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügen regal_4.set_fill_color(pDC,4); // Hier stehen noch mehr solcher Objekte, int (4) ist eines der besagten Werte, ist nur für die Farbe }
Es ist nur EINE EINZIGE ZEILE, wo der Fehler innerhalb DEINES Codes sein kann, und das muss irgendwo innerhalb von set_fill_color sein, und genau diese Funktion willst Du vorenthalten
-
Du willst wissen wo der Speicher voll läuft? Na ganz einfache Antwort. In Deinem Programm. Na, ist diese Aussage nicht super? Stimmt, die ist genaus super wie Dein Codesnipplet.
Fazit:
Wenn Deine Zeichenroutine überläuft, dann musst Du diese schon posten, damit wir sehen können ob Du richtig Deinen Speicer reservierst, alles wesentliche killst etc. Die überschrift ist ja auch "MFC mit VisualC++" und nicht "MFC mit Hellsehen".Gruß
Ocrana
-
Original erstellt von <Teaser>:
**Was stellen Leute die nicht helfen und nur meckern blöde Fragen?Ach ja, siehe deine Signatur...**
Hm, ja. Hälst dir wohl einen Spiegel vor *g*
Wie soll ich (oder jemand anderes) dir helfen wenn du noch nicht mal
bereit bist dein Problem genauer zu beschreiben, bzw. nur einwenig Code
zu zeigen. Also, bleib wo der Pfeffer wächst.Devil
-
// Hier stehen noch mehr solcher Objekte, int (4) ist eines der besagten Werte, ist nur für die Farbe
Das ist die entscheidende Zeile in deinem Code den du gepostet hast.
Ich gehe mal stark davon aus, dass du genau an dieser Stelle Objekte ohne Ende erstellst, aber die Ressourcen nicht wieder frei gibst. Und wenn das ganze in einem Timer-Ereignis abläuft, ist die Katastrophe perfekt, denn dann gehen Windows ganz schnell die Ressourcen aus - unter Consumer Windows schneller als unter Win NT basierenden Systemen.
Also du kannst es dir aussuchen: Entweder du postet hier den entscheidenden Code-Abschnitt und wir können dir helfen, oder du läßt es bleiben und suchst den Fehler alleine.
-
Ja davon rede ich doch die ganze Zeit: Da sind sehr sehr viele Shapes die erstellt werden und einfach über die anderen gezeichnet werden aber ich weiß nicht wie ich die wieder entferne, habe versucht mittels ReleaseDC(pDC); nach jeder Anweisung den Pointer freizugeben, dann nur einmal am Ende aber hat nichts gebracht, also poste ich hier jetzt die Dateien damit auch alle froh sind.
-
Falls du es nicht machst:
Wenn du was mit SelectObject selektiert hast dann musst du mit SelectObject den
Rückgabewert vom ersten SelectObject wieder selektieren.
-
Berücksichtigt das ein paar überflüssige Zeilen enthalten sind da ich den Maschinensimulator erst morgen zur Hand habe, ich mußte die Funktionalität anders austesten, leider...
------------------------------------------------------------------------------
// AKLTestumgebungView.cpp : Implementierung der Klasse CAKLTestumgebungView
//#include "stdafx.h"
#include "AKLTestumgebung.h"#include "AKLTestumgebungDoc.h"
#include "AKLTestumgebungView.h"
#include "AKL_GUI.h"#ifdef DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE_;
#endif/////////////////////////////////////////////////////////////////////////////
// CAKLTestumgebungViewIMPLEMENT_DYNCREATE(CAKLTestumgebungView, CView)
BEGIN_MESSAGE_MAP(CAKLTestumgebungView, CView)
//{{AFX_MSG_MAP(CAKLTestumgebungView)
ON_WM_LBUTTONDBLCLK()
ON_WM_TIMER()
ON_WM_CREATE()
//}}AFX_MSG_MAP
// Standard-Druckbefehle
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()void get_status_messages(void);
int testfarbe;
int Time=0;
/////////////////////////////////////////////////////////////////////////////
// CAKLTestumgebungView Konstruktion/DestruktionAnlagenkomponente regal_4(200,125,800,175);
Anlagenkomponente regal_3(200,225,800,275);
Anlagenkomponente regal_2(200,300,800,350);
Anlagenkomponente regal_1(200,400,800,450);Anlagenkomponente hhg_2(480,180,520,220);
Anlagenkomponente hhg_2_lam_1(445,190,480,210);
Anlagenkomponente hhg_2_lam_2(520,190,555,210);Anlagenkomponente hhg_1(480,355,520,395);
Anlagenkomponente hhg_1_lam_1(445,365,480,385);
Anlagenkomponente hhg_1_lam_2(520,365,555,385);Anlagenkomponente foerdertechnik_part_1(25,50,75,525);
Anlagenkomponente foerdertechnik_part_2(75,475,800,525);Anlagenkomponente auslaufbereich(30,55,70,95);
Anlagenkomponente scanner(30,480,70,520);Anlagenkomponente auslagerbahnhof_2(90,125,185,175);
Anlagenkomponente auslagerbahnhof_2_part_1(100,135,130,165);
Anlagenkomponente auslagerbahnhof_2_part_2(145,135,175,165);Anlagenkomponente einlagebahnhof_2(90,225,185,275);
Anlagenkomponente einlagebahnhof_2_part_1(100,235,130,265);
Anlagenkomponente einlagebahnhof_2_part_2(145,235,175,265);Anlagenkomponente auslagerbahnhof_1(90,300,185,350);
Anlagenkomponente auslagerbahnhof_1_part_1(100,310,130,340);
Anlagenkomponente auslagerbahnhof_1_part_2(145,310,175,340);Anlagenkomponente einlagebahnhof_1(90,400,185,450);
Anlagenkomponente einlagebahnhof_1_part_1(100,410,130,440);
Anlagenkomponente einlagebahnhof_1_part_2(145,410,175,440);
Anlagenkomponente Test(50,50,100,100);CAKLTestumgebungView::CAKLTestumgebungView()
{
// ZU ERLEDIGEN: Hier Code zur Konstruktion einfügen,}
CAKLTestumgebungView::~CAKLTestumgebungView()
{
}BOOL CAKLTestumgebungView::PreCreateWindow(CREATESTRUCT& cs)
{
// ZU ERLEDIGEN: Ändern Sie hier die Fensterklasse oder das Erscheinungsbild, indem Sie
// CREATESTRUCT cs modifizieren.
return CView::PreCreateWindow(cs);
}/////////////////////////////////////////////////////////////////////////////
// CAKLTestumgebungView Zeichnenvoid CAKLTestumgebungView::OnDraw(CDC* pDC)
{CAKLTestumgebungDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// ZU ERLEDIGEN: Hier Code zum Zeichnen der ursprünglichen Daten hinzufügenregal_4.set_fill_color(pDC,regal_4.status_color);
regal_3.set_fill_color(pDC,regal_3.status_color);
regal_2.set_fill_color(pDC,regal_2.status_color);
regal_1.set_fill_color(pDC,regal_1.status_color);
hhg_2.set_fill_color(pDC,hhg_2.status_color);
hhg_2_lam_1.set_fill_color(pDC,hhg_2_lam_1.status_color);
hhg_2_lam_2.set_fill_color(pDC,hhg_2_lam_2.status_color);
hhg_1.set_fill_color(pDC,hhg_1.status_color);
hhg_1_lam_1.set_fill_color(pDC,hhg_1_lam_1.status_color);
hhg_1_lam_2.set_fill_color(pDC,hhg_1_lam_2.status_color);
foerdertechnik_part_1.set_fill_color(pDC,foerdertechnik_part_1.status_color);
foerdertechnik_part_2.set_fill_color(pDC,foerdertechnik_part_2.status_color);
auslaufbereich.set_fill_color(pDC,auslaufbereich.status_color);
scanner.set_fill_color(pDC,scanner.status_color);
auslagerbahnhof_2.set_fill_color(pDC,auslagerbahnhof_2.status_color);
auslagerbahnhof_2_part_1.set_fill_color(pDC,auslagerbahnhof_2_part_1.status_color);
auslagerbahnhof_2_part_2.set_fill_color(pDC,auslagerbahnhof_2_part_2.status_color);
einlagebahnhof_2.set_fill_color(pDC,einlagebahnhof_2.status_color);
einlagebahnhof_2_part_1.set_fill_color(pDC,einlagebahnhof_2_part_1.status_color);
einlagebahnhof_2_part_2.set_fill_color(pDC,einlagebahnhof_2_part_2.status_color);
auslagerbahnhof_1.set_fill_color(pDC,auslagerbahnhof_1.status_color);
auslagerbahnhof_1_part_1.set_fill_color(pDC,auslagerbahnhof_1_part_1.status_color);
auslagerbahnhof_1_part_2.set_fill_color(pDC,auslagerbahnhof_1_part_2.status_color);
einlagebahnhof_1.set_fill_color(pDC,einlagebahnhof_1.status_color);
einlagebahnhof_1_part_1.set_fill_color(pDC,einlagebahnhof_1_part_1.status_color);
einlagebahnhof_1_part_2.set_fill_color(pDC,einlagebahnhof_1_part_2.status_color);
Test.set_fill_color(pDC,testfarbe);
pDC->TextOut(400,140,"Regal 4");
pDC->TextOut(400,240,"Regal 3");
pDC->TextOut(400,315,"Regal 2");
pDC->TextOut(400,415,"Regal 1");
pDC->TextOut(400,490,"Fördertechnik");
pDC->TextOut(90,180,"Auslagerbahnhof 2");
pDC->TextOut(90,280,"Einlagerbahnhof 2");
pDC->TextOut(90,355,"Auslagerbahnhof 1");
pDC->TextOut(90,455,"Einlagerbahnhof 1");
}
/////////////////////////////////////////////////////////////////////////////
// CAKLTestumgebungView DruckenBOOL CAKLTestumgebungView::OnPreparePrinting(CPrintInfo* pInfo)
{
// Standardvorbereitung
return DoPreparePrinting(pInfo);
}void CAKLTestumgebungView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// ZU ERLEDIGEN: Zusätzliche Initialisierung vor dem Drucken hier einfügen
}void CAKLTestumgebungView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// ZU ERLEDIGEN: Hier Bereinigungsarbeiten nach dem Drucken einfügen
}/////////////////////////////////////////////////////////////////////////////
// CAKLTestumgebungView Diagnose#ifdef _DEBUG
void CAKLTestumgebungView::AssertValid() const
{
CView::AssertValid();
}void CAKLTestumgebungView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}CAKLTestumgebungDoc* CAKLTestumgebungView::GetDocument() // Die endgültige (nicht zur Fehlersuche kompilierte) Version ist Inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CAKLTestumgebungDoc)));
return (CAKLTestumgebungDoc*)m_pDocument;
}
#endif //_DEBUG/////////////////////////////////////////////////////////////////////////////
// CAKLTestumgebungView Nachrichten-Handlervoid CAKLTestumgebungView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufenCView::OnLButtonDblClk(MK_LBUTTON, point);
if((point.x>=480 && point.x<= 520) && (point.y>=180 && point.y <= 220))
MessageBox("Test5");
if((point.x>=445 && point.x<= 480) && (point.y>=190 && point.y <= 210))
MessageBox("Test6");
if((point.x>=520 && point.x<= 555) && (point.y>=190 && point.y <= 210))
MessageBox("Test7");
if((point.x>=480 && point.x<= 520) && (point.y>=355 && point.y <= 395))
MessageBox("Test8");
if((point.x>=445 && point.x<= 480) && (point.y>=365 && point.y <= 385))
MessageBox("Test9");
if((point.x>=520 && point.x<= 555) && (point.y>=365 && point.y <= 385))
MessageBox("Test10");
if((point.x>=30 && point.x<= 70) && (point.y>=55 && point.y <= 95))
MessageBox("Auslaufbereich");
if((point.x>=30 && point.x<= 70) && (point.y>=480 && point.y <= 520))
MessageBox("Scanner");
if((point.x>=90 && point.x<= 185) && (point.y>=125 && point.y <= 175) ||
(point.x>=100 && point.x<= 130) && (point.y>=135 && point.y <= 165) ||
(point.x>=145 && point.x<= 175) && (point.y>=135 && point.y <= 165))
MessageBox("Auslagerbahnhof Gang 2");
if((point.x>=90 && point.x<= 185) && (point.y>=225 && point.y <= 275))
MessageBox("Test18");
if((point.x>=100 && point.x<= 130) && (point.y>=235 && point.y <= 265))
MessageBox("Test19");
if((point.x>=145 && point.x<= 175) && (point.y>=235 && point.y <= 265))
MessageBox("Test20");
if((point.x>=90 && point.x<= 185) && (point.y>=300 && point.y <= 350) ||
(point.x>=100 && point.x<= 130) && (point.y>=310 && point.y <= 340) ||
(point.x>=145 && point.x<= 175) && (point.y>=310 && point.y <= 340))
MessageBox("Auslagerbahnhof Gang 1");
if((point.x>=90 && point.x<= 185) && (point.y>=400 && point.y <= 450))
MessageBox("Test24");
if((point.x>=100 && point.x<= 130) && (point.y>=410 && point.y <= 440))
MessageBox("Test25");
if((point.x>=145 && point.x<= 175) && (point.y>=410 && point.y <= 440))
MessageBox("Test26");
// Hier muss die Funktion für die Statusmeldungen durchlaufen werden
}int CAKLTestumgebungView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;// TODO: Speziellen Erstellungscode hier einfügen
SetTimer(ID_GETSTATUS_TIMER,100,NULL);
return 0;
}void CAKLTestumgebungView::OnTimer(UINT nIDEvent)
{
// TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen und/oder Standard aufrufenTime++;
if(Time==1){
testfarbe=1;
//get_status_messages();
Invalidate(TRUE);
}if(Time==2){
testfarbe=2;
Invalidate(TRUE);
}if(Time==3){
testfarbe=8;
Invalidate(TRUE);
Time=0;
}CView::OnTimer(nIDEvent);
}void get_status_messages(void){
hhg_2.get_status(2,/*C_DID_HHG*/1);
hhg_2_lam_1.get_status(2,/*C_DID_LAM1*/1);
hhg_2_lam_2.get_status(2,/*C_DID_LAM2*/1);hhg_1.get_status(1,/*C_DID_HHG*/1);
hhg_1_lam_1.get_status(1,/*C_DID_LAM1*/1);
hhg_2_lam_2.get_status(1,/*C_DID_LAM2*/1);}
-------------------------------------------------------------------------------/*#include "..\include/stdafx.h"
#include "..\include/AKL_II_Host.h"#include "..\include/AKL_II_HostDoc.h"
#include "..\include/AKL_II_HostView.h"
#include "..\include/AKL_GUI.h"
#include "..\include/devmgr.h"*/#include "stdafx.h"
#include "AKL_GUI.h"
#include "AKLTestumgebungDoc.h"
#include "AKLTestumgebungView.h"const COLORREF farbe[9] = {
RGB( 204, 204, 204), // Grau
RGB( 255, 0, 0), // Rot
RGB( 0, 255, 0), // Grün
RGB( 0, 0, 0), // Schwarz
RGB( 0, 0, 255), // Blau
RGB( 0, 255, 255), // Cyan
RGB( 255, 0, 255), // Magenta
RGB( 255, 255, 0), // Gelb
RGB( 255, 255, 255) // Weiß
};Anlagenkomponente::Anlagenkomponente(int x_left,int y_top,int x_right,int y_bottom){
left = x_left;
bottom = y_bottom;
right = x_right;
top = y_top;
}void Anlagenkomponente::get_status(int Corridor, int Device){
//CDeviceManager* Manager;
//Manager->getInstance();
//device_name = Manager->getName(Corridor,Device);
//device_status = Manager->getStatus(Corrdidor,Device);
//packed_id = Manager->getPacketId(Corridor,Device);
if(device_status==0)
status_color=0;
if(device_status<0)
status_color=1;
if(device_status>0)
status_color=2;}
void Anlagenkomponente::create_rectangle(CDC* pDContext){
pDContext->Rectangle(CRect(left,top,right,bottom));
}void Anlagenkomponente::set_fill_color(CDC* pContext,int colour){
int colour_temp;
colour_temp = colour;
CBrush lSolidBrush(farbe[colour_temp]);
pContext->SelectObject(lSolidBrush);
create_rectangle(pContext);
}
-------------------------------------------------------------------------------#ifndef _ANLAGENKOMPONENTE_
#define _ANLAGENKOMPONENTE_class Anlagenkomponente {
public:
CString device_name;
int status_color;
int device_id;
int device_status;
int packet_id;
int left;
int right;
int top;
int bottom;Anlagenkomponente(int x_left,int y_top,int x_right,int y_bottom);
void get_status(int Corridor, int Device);
void set_fill_color(CDC* pContext,int status_color); // ruft create_rectangle auf
void create_rectangle(CDC* pDContext);
};#endif
-
Na daaaaa ist doch der Fehler:
Alt:void Anlagenkomponente::set_fill_color(CDC* pContext,int colour){ int colour_temp; colour_temp = colour; CBrush lSolidBrush(farbe[colour_temp]); pContext->SelectObject(lSolidBrush); create_rectangle(pContext);
Neu:
void Anlagenkomponente::set_fill_color(CDC* pContext,int colour){ CBrush lSolidBrush(farbe[colour]); CBrush* pOldBrush = pContext->SelectObject(lSolidBrush); create_rectangle(pContext); pContext->SelectObject(pOldBrush); // WARUM WIRD DIESE ZEILE IMMER WIEDER VERGESSEN?