| Autor |
Beitrag |
bis11
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Di 25.03.03 21:04
Hallo,
da ich ja dank der Such-Funktion vom Forum nun herrausbekommen habe, wie ich einen Thread erstelle und ausführen lasse, habe ich dazu noch ein paar Fragen. Und zwar möchte ich gerne wissen, wenn ich mal das Beispiel aus diesem Posting nehme.
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:
| unit Unit1;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type TWorkThread = class(TThread) public procedure Execute; override; end; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1; WT:TWorkThread; implementation
procedure TWorkThread.Execute; var lTick:LONGINT; begin //der Thread-Code hier - in diesem Beispiel wartet der Thread 3 Sekunden lang und gibt dann eine Nachricht aus lTick:=GetTickCount; repeat Application.ProcessMessages until (GetTickCount-lTick > 3000) OR Terminated; ShowMessage('3 Sekunden sind um!'); end;
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject); begin WT:=TWorkThread.Create(False); //False -> gleich mit der Abarbeitung loslegen
end;
end. |
Mir ist klar, wenn ich jetzt die Anwendung starte, kommt er in die Procedure FormCreate und startet den Thread. Mir ist nur unklar, was macht das Programm, wenn ich noch mehr Anweisungen im OnCreate-Ereignis der Form stehen habe ? Ich habe es zwar versucht rauszubekommen mit einzelschritten, aber das hat mir keine klare Antwort gebracht. Bleibt das Prog stehen bei dem Aufruf des Threads oder arbeitet es weiter ?
Könnte mir jemand bitte den Ablauf erklären ? Ich fange mit Thread nämlich erst an.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Di 25.03.03 21:58
brrrr, schlechtes Beispiel für einen trhead mit Application.ProcessMessages. Gerade ein Thread ist dafür dar, um solche Konstruktionen zu vermeiden. Sei's drum.
Wenn Du noch mehr Anweisungen in der OnCreate() Methode hast werden die auch ausgeführt. Stell dir vor, ein Thread ist ein separates Programm welches ASYNCHRON zu deinem mitläuft. Der Thread läuft allerdings im selben Kontext,d.h. du kannst via Thread.synchronize auf deine VCL Objekte zugreifen (um. z.b.. in einer Panel die Uhrzeit anzeigen zu lassen).
Es wär schlecht, wenn das Prog bei einem Thread-start stehen bleiben sollte. Das wär denn schlecht programmiert  .
grez
MSch
|
|
bis11 
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Mi 26.03.03 07:50
Was wäre denn ein besseres Beispiel ? Also habe ich das richtige verstanden, wenn das Programm in die Zeile
Quelltext 1:
| WT:=TWorkThread.Create(False); |
kommt wird der Thread sofort gestartet und die Anweisungen werden abgearbeitet paralell zum eigentlichen Programm ? Kann ich das irgendwie sehen im Taskmanager zum Beispiel, ob der Thread nun abgearbeitet wird, mal abgesehen von eventuellen Ausgaben am Bildschirm ?
|
|
maximus
      
Beiträge: 896
Win XP, Suse 8.1
Delphi 4/7/8 alles prof
|
Verfasst: Mi 26.03.03 12:03
| Zitat: | Kann ich das irgendwie sehen im Taskmanager zum Beispiel, ob der Thread nun abgearbeitet wird, mal abgesehen von eventuellen Ausgaben am Bildschirm ?
|
Ja. Dafür gibt es das thread-window in delphi - Ansicht->debug->threadWindow[/code]
|
|
bis11 
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Mi 26.03.03 12:43
Hi,
ich habe mich vielleicht etwas undeutlich ausgedrückt, ich wollte wissen ob das geht auf einem Rechner wo kein Delphi drauf installiert ist ?
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Do 27.03.03 20:17
Im Taskmanager nein, da ein Thread im Kontext der Anwendung läuft der ihn gestartet hat, erscheint dort lediglich die Anwendung.
grez
Msch
|
|
bis11 
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Do 27.03.03 20:27
Hi msch,
du hattest doch gesagt, das Beispiel was ich ganz oben angeben habe wäre ein schlechtes. Haste ein besseres ?
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Do 27.03.03 22:03
hmmm,
so auf kürze mal schauen. Aber warum schlechtes Beispiel? Ganz Einfach, es ist Grütze in einem Thread Application.ProcessMessages aufzurufen. Der Thread kriegt eh seine Zeit zugeteilt und muß nicht die Kontrolle e.g. Nachichtenpipline weiterreichen. Das ist unnötig.
Das Problem kömmt dann noch schlimmer, wenn du einen Dienst/Service schreibst. Dort ist es sogar verboten, solche Kontruktore zu verwenden.
(Da gibts nämliche keine Application).
Hier ein Beispiel zum Anzeigen der Zeit und des Datums in einem Panel der Anwendung (Orpheus-Komponenten, daher die Units):
unit sbpZeit;
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:
| interface
uses Classes,o32sbar;
type TStatusBarPanelZeit = class(TThread) private Panel: TO32StatusPanel; // Panel wo die Zeit angezeigt wird procedure UpdatePanel; virtual; protected procedure Execute; override; public Constructor Create(aPanel:TO32StatusPanel); end;
// für das Datum einfach ne Ableitung und die Updatemethode überschreiben TStatusBarPanelDatum = Class(TStatusbarPanelZeit) private procedure UpdatePanel; override; end;
implementation
uses SysUtils;
constructor TStatusBarPanelZeit.Create; begin Inherited Create(true); Panel:=aPanel; Priority:= tpIdle; // nur im Leerlauf Resume; // und Thread starten end;
procedure TStatusBarPanelZeit.Execute; begin while not terminated do // solange nicht beendet Synchronize(UpdatePanel);// Zeit updaten end;
procedure TStatusBarPanelZeit.UpdatePanel; begin Panel.Text:= TimeToStr(now);// Zeit anzeigen end;
procedure TStatusBarPanelDatum.UpdatePanel; begin Panel.Text:= DateToStr(now);// Zeit anzeigen end;
end. |
nich schön, aber selten und da der Thread nur in der Leerlaufzeit läuft, gibts auch nichts zu bemosern, das andere Anwendungen nicht zum Zuge kommen.
grez
MSch
|
|
bis11 
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: Fr 28.03.03 21:58
Hallo,
sorry, dass ich erst jetzt antworte, aber ich bedanke mich für Dein Beispiel. Das bringt mich schon eine Ecke weiter. Jetzt fehlt mir nur noch, wie ich Werte an den Thread übergeben kann und wie ich Werte vom Thread wieder an die Anwendung übergeben kann, hättest Du da auch noch ein Beispiel für mich.
Ich bedanke mich schon mal im vorraus für Deine Mühen.
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Sa 29.03.03 13:14
schau dir das Beispiel an, dort wird an den Thread ein Panel übergeben.
Rückgabewerte von Threads an den Aufrufer geht nicht so einfach, da das nur über Variablen geht, die Threadsicher sein müssen. Leider hab ich da im moment kein Beispiel.
grez
MSCH
|
|
bis11 
      
Beiträge: 1247
Erhaltene Danke: 2
Apple Mac OSX 10.11
|
Verfasst: So 30.03.03 12:17
Hi MSCH,
ich danke Dir, jetzt habe ich erstmal ein bisschen wissen über Threads das ich jetzt einsetzen kann.
|
|
|