Autor Beitrag
Passi077
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 125

Win XP
D7 Pers
BeitragVerfasst: Sa 15.03.08 23:08 
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:
ausblenden volle Höhe Delphi-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:
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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

  // Texturlader-Thread
  loadTexThread = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
  end;

var
  Form1: TForm1;

  // Texturen
  background1, background2: gluint;

  //Test
  rotState:real=0;

  //Threads
  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
 // Load Texture has finished
  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(); // Renders OpenGL

 end;

 close;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin

  // Thread Init
  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
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Sa 15.03.08 23:17 
ausblenden Delphi-Quelltext
1:
  texLoadThread.Execute;					


ersetz das mal durch

ausblenden Delphi-Quelltext
1:
  texLoadThread.Resume;