Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit Thread


Marekventur - Do 06.11.03 17:11
Titel: Problem mit Thread
Hi!

Ich habe einen Thread geschrieben, wenn ich in aber über execute starte dann beginnt der Thread, der Hauptprogrammablauf blaibt aber hinter execute stehen.

Delphi-Quelltext
1:
2:
Thraed.execute;
ShowMessage('');


D.h. erst wenn TThread.Execute komplett fertig ist wird die Message gezeigt.

Das ist doch normalerweise total falsch? :idea:

Könntet ihr mir sagen, woher das kommen könnte?

PS: Selbst Buttons reagieren erst nach ende des Thread.execute auf klicks, bzw die Ereignissroutine wird so lange verzögert..

THX
Marek

Moderiert von user profile iconTino: BBCode aktiviert.


ShadowThief - Do 06.11.03 17:27

einen thread startest du auch nicht mit execute
sondern der thread wird entweder gleich beim erstellen gestartet:


Delphi-Quelltext
1:
MyThread := TMyThread.Create(False);                    


oder du pausierst ihn beim erstellen


Delphi-Quelltext
1:
MyThread := TMyThread.Create(True);                    


und machst dann


Delphi-Quelltext
1:
MyThread.Resume;                    


dann gehts.

die Execute-methode wird automatisch aufgerufen, das musst du
nicht machen.

shadow.


Marekventur - Sa 08.11.03 17:30

THX

ich war schon kurz davor das neu gelernte Wissen nie mehr zu gebrauchen.... Danke!


Jagg - Sa 06.03.04 06:03

oh genau das habe ich auch gesucht ;)
wenn ich jetzt aber den thread starte mit create(false)
wo muss ich dann meinen Thread Code hinzutun damit er abgearbeitet wird !
ich execute vllt oder direkt nach create ???
und noch eine frage wenn ich 1 thread dann habe wie lass ich mehrere threads laufen
auch mit create(false) ???


Jagg - Sa 06.03.04 06:08

so nun hier ist mein code


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure StartThread; 
var 
   MyThread: TThread; 
begin 
   MyThread := TThread.Create(true); {true bewirkt, dass der Thread initalisiert, aber noch nicht gestartet wird} 
   MyThread.Priority := tpLower; 
   MyThread.FreeOnTerminate := true;  //so wird der Thread auch nach dem beenden automatisch aus dem Speicher entfernt 

   MyThread.Resume;  //der Thread wird gestartet 
end

procedure MyThread.Execute; 
begin 
  showmessage('Hallo'); 
end;



...soviel ich wird bei MyThread.Resume der Thread gestartet und dann die Procedure MyThread.Execute aufgerufen oder ???
...weil er springt bei mir nicht in diese procedure rein !
Was mache ich falsch ???
(naja,das mit dem showmessage ist nicht so einfallsreich,aber ich ja nur zum testen ob es auch geht)

Moderiert von user profile iconPeter Lustig: Delphi-Tags hinzugefügt


ShadowThief - Sa 06.03.04 12:10

sorry, aber da komm ich jetzt nicht mit. das ist doch alles relativ selbsterklärend:

ihr seid in eurem projekt. dann macht ihr datei -> neu -> weitere -> thread-objekt ->
dem thread einen namen geben (TMyThread, das 'T' von 'TMyThread' ist wichtig, weil ihr erstellt grad eine thread-klasse), dann habt ihr also ne neue unit, in der eure threadklasse angelegt ist. eine 'procedure Execute' gibts auch schon, da schreibt ihr euren code rein (Achtung: 'Execute' wird nur 1x ausgeführt, ihr müsst also ne schleife programmieren, wenn ihr wollt, das irgendwas öfters ausgeführt wird. so das wars zu dieser unit. in einer anderen unit macht ihr dann folgendes


Delphi-Quelltext
1:
MyThread := TMyThread.Create(False); // Execute wirde sofort abgearbeitet                    



Delphi-Quelltext
1:
2:
MyThread := TMyThread.Create(True); // Objekt wird erstellt aber Execute wartet noch
MyThread.Resume; // aber jetzt !


ähm, viel mehr gibts da nicht zu sagen ....

shadow.

Moderiert von user profile iconTino: Überflüssige Absätze entfernt.


Christian S. - Sa 06.03.04 13:14

Sag mal Jagg, was soll das eigentlich, Deine Frage in zwei Threads zu posten? Den anderen habe ich mal geschlossen.


Udontknow - Sa 06.03.04 20:28

Ist die Deklaration der Prozedur Execute mit "override" gekennzeichnet?

Cu,
Udontknow


ShadowThief - So 07.03.04 14:03

@Udontknow:
an wen geht die frage? ja es ist eine override-procedure.

shadow.


Udontknow - So 07.03.04 14:55

Die Frage ging an Marekventur. Wenn er den Thread manuell implementiert hat und nicht über den Experten, könnte die Ursache, daß die Prozedur nicht angesprungen wird, eben genau an einer fehlenden "override"-Kennzeichnung liegen.

Cu,
Udontknow


Jagg - So 07.03.04 17:05

also ich habe kein thread objekt erstellt ich hab einfach nur eine form genommen
das müsste damit auch gehen oder ????
ich habe den code so wie oben aber es klappt nicht ich weiss nicht woran es liegt
und das mit dem ovveride habe ich auch

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
ype
  MyThread = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
  end;


Moderiert von user profile iconPeter Lustig: Code- durch Delphi-Tags ersetzt


Jagg - So 07.03.04 17:16

so,leute ich habe das jetzt mit dem execute habe es gefunden
wie mache ich das jetzt noch das er mehrere threads paralell macht ???
muss ich die execute prozedur mehrmals aufrufen ode eine schleife machen ???


Christian S. - So 07.03.04 17:20

Hallo!

Hast Du Dir dieses [http://www.delphi-source.de/tutorials/threads/] Tutorial mal durchgelesen?

MfG
Peter


Jagg - So 07.03.04 18:20

ich hätte jetzt mal eine andere frage .
Was bedeutet das "override" eigentlich ?
und was bedeutet "Private,public and protected" ?


Christian S. - So 07.03.04 18:24

Neue Frage, neuer Thread. Schau Dir dazu mal Luckies Klassen-Tutorial an.


Jagg - So 07.03.04 19:59

danke werd mich nochmal melden