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 public 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); NewImage:=TImage.Create(FHaupt); NewImage.Left:=10; NewImage.Top:=10; NewImage.Picture.LoadFromFile('laden.gif'); end;
procedure TTestThread.Execute; begin 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
Narses: 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
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!