Autor |
Beitrag |
M. Raab
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: 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:
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:
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
|
Verfasst: 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 
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: 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:
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:
Quelltext 1: 2:
| glDraw(); // Szene zeichnen SwapBuffers(h_DC); // Szene ausgeben |
Gruss
Markus
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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. 
|
|
M. Raab 
      
Beiträge: 334
Erhaltene Danke: 1
WIN 7
Delphi XE
|
Verfasst: 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
Gruss
Markus
|
|
|