Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Thread erstellen


colaka - Mo 30.08.10 06:58
Titel: Thread erstellen
Hallo,

ich lade täglich von 12 verschiedenen Lieferanten die Artikeldateien in meine WaWi. Das dauert insgesamt ungefähr 10 Minuten, während denen man oft den Eindruck hat, das Programm wäre abgestürzt. Vor allem auch deshalb, weil sowohl ein anmiertes Gif als auch eine timergesteuerte Laufschrift of längere Zeit stehenbleiben. Hier im Forum hat man mir dazu geraten, das Gif über einen 2. Thread laufen zu lassen. Um das Problem auf den Kern zu reduzieren, habe ich mir ein kleines Testprogramm erstellt, das nur das Gif-Bild in einem 2.Thread starten und wieder stoppen soll. Doch das funktioniert nicht.


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:
unit UHaupt;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, GifImage, ExtCtrls, StdCtrls;

type
  TFHaupt = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;
  TTestThread = class(TThread)
    constructor Create (CreateSuspended : Boolean);
  protected
    procedure Execute; override;
  end;

var
  FHaupt: TFHaupt;
  Thread : TTestThread;
  NewImage:TImage;
  NewForm:TForm;

implementation

{$R *.dfm}

constructor TTestThread.Create (CreateSuspended : Boolean);
begin
inherited Create (CreateSuspended);
//NewForm:=TForm.Create(Application);
//NewForm.Width:=150;
//NewForm.Height:=150;
//NewForm.Top:=150;
//NewForm.Left:=150;
//NewForm.Show;
  NewImage:=TImage.Create(FHaupt);
  NewImage.Left:=10;
  NewImage.Top:=10;
//  NewImage.Parent:=NewForm;
  NewImage.Picture.LoadFromFile('laden.gif');
end;

procedure TTestThread.Execute;
begin
//   Application.ProcessMessages;
end;

procedure TFHaupt.Button2Click(Sender: TObject);
begin
  Thread := TTestThread.Create(True);
  Thread.Resume;
end;

procedure TFHaupt.Button3Click(Sender: TObject);
begin
  Thread.Free;
end;

end.


Inzwischen habe ich Zweifel, ob mein Vorhaben überhaupt möglich ist. Allerdings habe ich noch nie mit Threads gearbeitet, so daß ich es auch für möglich halte, daß ich da was grundsätzliches falsch mache.

Vielleicht kann mir hier jemand auf dei Sprünge helfen.

Danke Ebi


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 30.08.2010 um 15:43


Nersgatt - Mo 30.08.10 07:13

Da müsstest Du mal erklären, was genau Du unter "Funktioniert nicht" verstehst.
Ich denke auch, das Gif in dem Thread zu erstellen ist genau der falsche Weg. Andersrum wird ein Schuh draus. Du solltest die Import-Arbeit in einem extra Thread erstellen und die Warteanzeigen im Hauptthread machen.

Jens


delfiphan - Mo 30.08.10 07:37

Das kommt auf die GIF Komponente darauf an. Aber wahrscheinlich ist, dass die Komponente nicht Thread-Safe ist und intern mit Timern arbeitet, der innerhalb des Threads nicht funktioniert (da kein Messageloop existiert).

Wie bereits erwähnt solltest du den Hauptthread nicht blockieren sondern längere Arbeiten immer in einem Thread machen.


Flamefire - Mo 30.08.10 12:40

Falscher Ansatz:
Nicht die GUI (in dem Fall das GIF) sollte in einen neuen Thread, sondern die Arbeit, die die GUI blockiert!
Also deine 10min Ladeprozedur