Hallo,
ich schreibe zur Zeit an einem kleinen OpenGL Programm. Dieses verwendet unter anderem Texturen, und zwar viele. Da aber nicht alle immer benötigt werden, möchte ich einen Teil zur Laufzeit laden, sobald sie benötigt werden.
Dabei soll aber das Programm nicht unterbrochen werden. Genau das ist aber der Fall, wenn ich die Textur einfach nachlade. Daher habe ich nun das Laden der Textur in einen eigenen Thread ausgelagert, in der Hoffnung, dass die Hauptanwendung dann weiter läuft.
Doch leider ist genau das nicht der Fall. Es hat sich zur vorherigen Implementierung nichts geändert: Beim laden der Textur hängt das Hauptprogramm so lange, bis die Textur geladen ist.
Hier mein Quellcode:
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: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, inifiles, dglOpenGL, Textures, math, ComCtrls;
type TForm1 = class(TForm) Button1: TButton; procedure FormActivate(Sender: TObject); procedure Render(); procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure threadDone(Sender: TObject);
private public end;
loadTexThread = class(TThread) private protected procedure Execute; override; end;
var Form1: TForm1;
background1, background2: gluint;
rotState:real=0;
texLoadThread: loadTexThread; anzT: integer=0;
implementation
{$R *.dfm}
procedure loadTexThread.execute(); begin LoadTexture('gfx\bg1.jpg', background1, False); Terminate(); end;
procedure TForm1.threadDone(Sender: TObject); begin if sender is loadTexThread then begin dec(anzT); end; end;
procedure TForm1.FormActivate(Sender: TObject); begin Running := true;
while running do begin
application.ProcessMessages; render(); end;
close; end;
procedure TForm1.FormCreate(Sender: TObject); begin
texLoadThread := loadTexThread.Create(true); texLoadThread.OnTerminate := threadDone; texLoadThread.Priority := tpIdle;
end;
procedure TForm1.Button1Click(Sender: TObject); begin anzT:=1; texLoadThread.Execute; end;
end. |
Wieso ist das so, und was muss ich tun um mein Ziel zu erreichen?
Vielen Dank + Grüße
Pascal