Autor Beitrag
M. Raab
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: So 12.01.03 15:45 
Hallo NG,

ich bin mir nicht sicher, ob das Thema hier her gehört, hat aber was mit API zu tun. Ich benutze WIN XP und leide seit kurzen unter Systemabstürzen. Nun bin ich endlich hinter den Auslöser (nicht URSACHE !!) gekommen.

Ich erzeuge zur Laufzeit einige Fenster (16 Stück). Hier der Erzeugungscode:

ausblenden Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
       Application.CreateForm(TForm,Profil[lochnummer]);
       with profil[lochnummer] do
         begin
           doublebuffered:=true;
           caption:=inttostr(lochnummer)+'. Profil von : '+form1.table1.FieldByName('BEZ').asstring;
           autosize:=false;
           borderstyle:=bssingle;
           clientheight:=555;
           clientwidth:=820;
           constraints.maxheight:=600;
           constraints.maxwidth:=840;
           constraints.minheight:=600;
           constraints.minwidth:=840;
           cursor:=crHandPoint;
           position:=poscreencenter;
           tag:=lochnummer;
           keypreview:=true;
           onclosequery:=schliessen;


So, das funktioniert alles gut und störungsfrei. Dann erzeuge ich über die API ein zweites Fenster für OPenGL Reendering. Her der Code:

ausblenden volle Höhe Quelltext
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:
  wndClass : TWndClass;         // Fenster Klasse
  dwStyle : DWORD;              // Fenster Stil
  dwExStyle : DWORD;            // Erweiterter Fenster Stil
  dmScreenSettings : DEVMODE;   // Bildschirm Einstellungen (fullscreen, etc...)
  PixelFormat : GLuint;         // OpenGL Einstellungen (Pixelformat)
  h_Instance : HINST;           // aktuelle Instanz
  pfd : TPIXELFORMATDESCRIPTOR;  // Einstellungen für das OpenGL Fenster
begin
  h_Instance := GetModuleHandle(nil);       // Instanz für's Fenster holen
  ZeroMemory(@wndClass, SizeOf(wndClass));  // Daten in wndClass löschen

    dwStyle := WS_OVERLAPPEDWINDOW or     // Überschneidung zulassen
               WS_CLIPCHILDREN or         // Kein Zeichnen in Child Fenstern
               WS_CLIPSIBLINGS;           // Kein Zeichnen in Sibling Fenstern
    dwExStyle := WS_EX_APPWINDOW or       // Fenster im Fordergrund
                 WS_EX_WINDOWEDGE;        // Erhobener Rand

  with wndClass do                    // Setup der Fenster Klasse
  begin
    style         := CS_HREDRAW or    // Neuzeichenen wenn Fenster-Breite geändert
                     CS_VREDRAW or    // Neuzeichenen wenn Fenster-Höhe geändert
                     CS_OWNDC;        // Device Context exlusiv
    lpfnWndProc   := @WndProc;        // WndProc wird als Window Procedure gesetzt
    hInstance     := h_Instance;
    hCursor       := LoadCursor(0, IDC_ARROW);
    lpszClassName := 'OpenGL';
  end;


  // Das oben definierte Fenster wird erstellt
  h_Wnd := CreateWindowEx(dwExStyle,      // Erweiterter Fenster Stil
                          'OpenGL',       // Name der Klasse
                          WND_TITLE,      // Fenster Titel (caption)
                          dwStyle,        // Fenster Stil
                          0, 0,           // Fenster Position
                          Width, Height,  // Größe des Fensters
                          0,              // Keine Paren-Windows
                          0,              // Kein Menü
                          h_Instance,     // die Instanz
                          nil);           // Kein Parameter für WM_CREATE


Das OPenGL Fenster wird durch eine Schleife ständig aktualisiert und neu erstellt. Bewege ich das Fenster oder bewege die Szene im OPenGL Fenster, kommt es nach einer gewissen Zeit zum kompletten ABsturz von WIN - da hlift nur noch ausstecken. Ich dachte bisher an Hardwaredefekte o.ä. Der PC läuft aber störungsfrei wenn ich das WIN API Fenster nicht öffne. Die Ursache muss meiner Meinung in der Tatsache liegen, dass ich Fenster mit API und "Delphi" erzeugt habe. Kennt jemand eine Abhilfe ?

Gruss


Markus
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 12.01.03 16:19 
M. Raab hat folgendes geschrieben:
Die Ursache muss meiner Meinung in der Tatsache liegen, dass ich Fenster mit API und "Delphi" erzeugt habe.

Meine persönliche Meinung: ich glaube nicht. Vielleicht hat´s damit zu tun, dass du das Fenster in der Schleife ständig neu erzeugst ... gibst du das alte, jeweils zuvor erzeugte Fenster denn auch wieder frei?
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: So 12.01.03 16:58 
Hallo Mathias,

nö nö.... in der Schleife lasse ich nur die Szene neu erstellen. Ich benutze da nur den Handle des Fensters und den Szenenzeiger. Ich gebe das Fenster beim Schliessen wieder frei. Hier der Code:

ausblenden Quelltext
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:
  // Freigabe des Device und Rendering Contexts.
  if (not wglMakeCurrent(h_DC, 0)) then
    MessageBox(0, 'Release of DC and RC failed!', 'Error', MB_OK or MB_ICONERROR);

  // Löscht Rendering Context
  if (not wglDeleteContext(h_RC)) then begin
    MessageBox(0, 'Release of rendering context failed!', 'Error', MB_OK or MB_ICONERROR);
    h_RC := 0;
  end;

  // Gibt Device Context fre
  if ((h_DC > 0) and (ReleaseDC(h_Wnd, h_DC) = 0)) then  begin
    MessageBox(0, 'Release of device context failed!', 'Error', MB_OK or MB_ICONERROR);
    h_DC := 0;
  end;

  // Schließt das Fenster
  if ((h_Wnd <> 0) and (not DestroyWindow(h_Wnd))) then begin
    MessageBox(0, 'Unable to destroy window!', 'Error', MB_OK or MB_ICONERROR);
    h_Wnd := 0;
  end;

  // Entfernt window class Registrierung
  if (not UnRegisterClass('OpenGL', hInstance)) then begin
    MessageBox(0, 'Unable to unregister window class!', 'Error', MB_OK or MB_ICONERROR);
    hInstance := 0;
  end;


Es kann jedoch sein, dass die Schlefe ansich die Ursache ist. Die Schleife ist eine simple while not finished (mit finished dann false) Schleife. Kann es sein, dass sich das Programm darin fängt ? Dort steht als Code jedoch lediglich:
ausblenden Quelltext
1:
2:
      glDraw();                           // Szene zeichnen
      SwapBuffers(h_DC);                  // Szene ausgeben


Gruss


Markus
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 16.01.03 04:41 
Zeig mal die Nachrichenschleife für das mit CreateWindow erzeugte Fenster.

Zitat:

Include-Dateien mit nützlichen Routinen für die nonVCl-Programmierung.

Das kann ich ausschließen, das mache ich zu 90% so und hatte noch nie Probleme. :roll:
M. Raab Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 334
Erhaltene Danke: 1

WIN 7
Delphi XE
BeitragVerfasst: Fr 17.01.03 13:31 
Hallo Luckie,


also, die Ursache ist gefunden: es liegt ein Schaden am AGP Bus am Board vor. Der zeigt sich immer dann nach einiger Zeit, wenn eine entsprechende Last vorliegt. Zum Glück habe ich noch Garantie :D

Gruss

Markus