AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread startet nicht sofort

Ein Thema von zweitakt · begonnen am 29. Jan 2008 · letzter Beitrag vom 29. Jan 2008
Antwort Antwort
zweitakt

Registriert seit: 29. Jan 2008
3 Beiträge
 
#1

Thread startet nicht sofort

  Alt 29. Jan 2008, 10:45
Hallo,

ich habe ein Problem mit meinem Testprogramm. Und zwar wird der Thread erst gestartet nach dem der Prozess, indem ich die Funktion Create aufrufe, beendet wurde. Laut Dokumentaion sollte der Thread aber sofort nach Aufruf von Thread.Resume starten. Hat von euch vielleicht jemand eine Idee?

Delphi-Quellcode:
procedure TTest.Execute;
begin
  try
    a := 0;
    while (a < 100) do
    begin
      inc(a);
      Form1.Memo1.Lines.Add(IntToStr(a));
      sleep(50);
    end;
  except
    on e: exception do begin
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var wf : DWORD;
begin
  Thread1 := TTest.Create(True);
  Thread1.FreeOnTerminate := True;
  Thread1.Resume;
  sleep(5000);
end;
  Mit Zitat antworten Zitat
29. Jan 2008, 10:49
Dieses Thema wurde von "Matze" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
Delphi-Frage
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#3

Re: Thread startet nicht sofort

  Alt 29. Jan 2008, 11:00
das ist nicht richtig. der thread startet sofort.
du siehst nur nicht die ausgabe des threads.

das sleep(5000) bringt den vcl thread zum schlafen, welches zu der folge hat, dass deine ausgaben nicht mehr angezeigt werden.

achtung:
die vcl ist nicht threadsafe!

wenn du im thread ausgaben in deine vcl form machen willst, dann solltest du die beiden threads syncronisieren.

Form1.Memo1.Lines.Add(IntToStr(a)); sowas direkt aufzurufen ist schlecht.

kontaktiere mal die hilfe, dort ist ein beispiel für "syncronize()" drin.

[edit]
p.s. willkommen in der dp
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
zweitakt

Registriert seit: 29. Jan 2008
3 Beiträge
 
#4

Re: Thread startet nicht sofort

  Alt 29. Jan 2008, 11:08
Erstmal danke für die schnelle Antwort. Wenn ich den Code folgendermassen ändere, ist der Effekt der gleiche, obwohl der Prozess nicht "schläft".

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var hThread : Thandle;
    ThreadID : Cardinal;
    wf : DWORD;
begin
  Thread1 := TTest.Create(True);
  Thread1.FreeOnTerminate := True;
  Thread1.Resume;
  while (true) do; <------Endlosschleife, nicht schön, aber geht. Wenn ich sie weglasse, startet der Thread sofort.
end;
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: Thread startet nicht sofort

  Alt 29. Jan 2008, 11:12
Diese Ziele veranlasst, Form1.Memo1.Lines.Add(IntToStr(a)); dass deinem Memo eine Message geschickt wird, es solle doch mal bitte den neuen Eintrag hinzufügen.

Ob das Memo (bzw, der Thread in dem das Memo ist) nun schläft oder endlos auf der Stelle hüpft kommt aufs gleiche raus. Es kommt einfach nicht zum neu zeichnen. Dazu muss es erstmal aus der aktuellen Messagebearbeitung (au sder aktuellen Funktion etc.) raus.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Thread startet nicht sofort

  Alt 29. Jan 2008, 11:21
Setzte einfach mal Haltepunkte (im Thread und im hauptprogramm) und du wirst sehen das beides läuft.

Aber wie die anderen bereits erwähnt haben solltest du nicht vom Thread aus auf VCL Elemente zugreifen. Ansonsten wirst du früh oder später Fehler bekommen wie "canvas does not allow drawing" oder ein Control malt sich einfach nicht mehr neu.

Zudem sollte dir bewusst sein das die Grafische Ausgabe zum hauptthread gehört. Und während dieser in einer Endlosschleife hängt oder schläft kann er nicht die Oberfläche neu zeichnen (er kenn eben immer nur einwas)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#7

Re: Thread startet nicht sofort

  Alt 29. Jan 2008, 11:23
Delphi-Quellcode:
class TTest = class(TThread)
public
  a: integer;
  [...]
end;

implementation

procedure TTest.Execute;
begin
  try
    a := 0;
    while (a < 100) do
    begin
      inc(a);
      synchronize(machsFit);
      sleep(50);
    end;
  except
    on e: exception do begin
    end;
  end;
end;

procedure TTest.machsFit;
begin
  form1.memo1.lines.add(inttostr(a));
end;

procedure TForm1.Button1Click(Sender: TObject);
var wf : DWORD;
begin
  Thread1 := TTest.Create(True);
  Thread1.FreeOnTerminate := True;
  Thread1.Resume;
end;
So (ungefähr, ungetestet) müsste es ordentlich sein. Wenn du in deinem Test unbedingt ein Sleep möchtest, erstelle im Thread einfach eine Datei, drück den Button und guck schnell nach (innerhalb der 5 Sleep Sekunden) ob die Datei da ist...
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#8

Re: Thread startet nicht sofort

  Alt 29. Jan 2008, 11:25
einige Thread-Erstellungsfunktionen von Delphi starten wirklich nicht gleich.

füge mal ein Sleep(0); nach Thread1.Resume; ein ... mit etwas "Glück" hilft das schon.

aber die Threadsaveangelegenheit bezüglich der VCL solltest du dennoch beheben.
und wozu einen anderen Thraed, wenn du den Hauptthread schlafen legst (anhälst)?

> Slepp und die Endlosschleife unterbrechen de Ausführung des Hauptthreads (legen diesen also sozusagen schlafen)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
zweitakt

Registriert seit: 29. Jan 2008
3 Beiträge
 
#9

Re: Thread startet nicht sofort

  Alt 29. Jan 2008, 12:40
Hallo,

danke für die zahlreichen Antworten. Da muss ich mir wohl ein anderes Programmdesign ausdenken.

zweitakt
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.416 Beiträge
 
Delphi XE5 Professional
 
#10

Re: Thread startet nicht sofort

  Alt 29. Jan 2008, 15:00
while (true) do; ist wie deine sleep idee...
der vcl prozess kann nicht das fenster neu malen.
du siehst deine änderungen nicht.

Delphi-Quellcode:
while (true) do
  application.processmessages;
würde deine änderungen zwar anzeigen, aber gut ist das so nicht.
dein multithreadproblem bleibt.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz