Autor Beitrag
colaka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: Mo 30.08.10 06:58 
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.

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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)

Für diesen Beitrag haben gedankt: Hidden
delfiphan
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: Hidden
Flamefire
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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