Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Jul 16, 2025 19:35

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: OpenGL in einer DLL !
BeitragVerfasst: Do Dez 09, 2004 11:43 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach,

ich habe nen problem, ich habe mir ne DLL gebasteln... da is der standard OpenGL Initialiserungskram drin.
also DC holen, Renderkontext erstellen, Renderkontext aktivieren usw.

die dll hat nur 3 funktionen für exports, Init, Kill und Resize.

Nun ruft ein anderes Delphi App die DLL auf:

[pascal]
procedure InitR(_AOwner : HWND); stdcall; external 'interface_test.dll' name 'Init';
procedure KillR; stdcall; external 'interface_test.dll' name 'Kill';
procedure ResizeR(_Width, _Height : Integer); stdcall; external 'interface_test.dll' name 'Resize';

implementation

{$R *.DFM}

procedure TfrmMain.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
InitR(Handle);
end;

procedure TfrmMain.FormDestroy(Sender: TObject);
begin
KillR;
end;

procedure TfrmMain.FormResize(Sender: TObject);
begin
ResizeR(ClientWidth, ClientHeight);
end;
[pascal]

In Der DLL App wird auch bei Init ein Renderthread (TThread) Initialisiert und fängt dann an zu rendern (Normal Priority).

Komischerweise ist das endergebnis aber so:
Bild

Bildfehler, und das fehlerhafte bild stammt von einem vorherigem geöffnetem OpenGL Prog.
Sprich er aktuallisiert das bild nicht.

Der Renderthread läuft aber einwandfrei weiter, daran liegt nicht.

Ich denke mal es ist nur ne kleinigkeit :)

Wäre nett wenn sich jemand mal den src anschaut und das fixed.

Hier ist der Source (DLL + Sample) http://www.xenorate.com/final/tempfiles/OpenGL_in_DLL.zip


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Dez 11, 2004 13:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das hier :
Code:
  1. procedure TR3DThread.Execute;
  2. begin
  3.   while not Terminated do
  4.    Run;
  5. end;
  6.  
  7. procedure TR3DThread.Run;
  8. begin
  9.   if Assigned(FRunProc) then
  10.     FRunProc;
  11. end;


Kann so nicht gehen. Zum einen solltes du die Sachen in eine CriticalSection packen und sychronisieren, und zum anderen wird dein Programm niemals dazu kommen die Puffer zu tauschen, da dein Thread permanent abläuft und du gar keine Bedingung hast. Du musst also im Execute z.B. sowas machen :

Code:
  1. procedure TNewtonThread.Execute;
  2. begin
  3. while not Terminated do
  4.  if (DoUpdate) then
  5.   begin
  6.   if not Pause then
  7.    Synchronize(UpdateNewton);
  8.   DoUpdate := False;
  9.   end
  10.  else
  11.   begin
  12.   Sleep(Resolution);
  13.   DoUpdate := True;
  14.   end;
  15. end;

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 17 Queries | GZIP : On ]