Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Thread und Form... (https://www.delphipraxis.net/180912-thread-und-form.html)

Metschu 30. Jun 2014 17:58

Thread und Form...
 
Hallo zusammen,

derzeit Versuche ich ein wenig mit Threads zu Arbeiten und hab folgende Procedure:

Delphi-Quellcode:
Procedure tTestForm.TestProcedure (Sender:tObject);
Var i:Integer;

Begin;
 i:=0;
 repeat;
  inc(i);
  Label1.caption:=IntToStr(i)
  Sleep(100)
 Until Abbrechen
end;
Starte ich die Procedure über einen Button, läuft sie Durch.
Wird diese als Thread gestartet, dann bricht sie bei "Label1.Caption..." mit einer Fehlermeldung ab.
Setzte ich dann "tTestform" vor das "Label1.Caption", klappt dies auch im Thread.

Kommt dies durch die Auslagerung des Threads? Kann man das auch einfacher umgehen?

Hab eine Größere Procedure mit Funktionen und Labels, dessen umschreiben ziemlich mühsam wäre...

Danke schonmal!

Gruß
Torsten

himitsu 30. Jun 2014 18:01

AW: Thread und Form...
 
Grundsätzlich wird man doch eigentlich in allen Thread-Tutoials darauf hingewiesen, daß man von einem Thread aus niemals auf VCL-Komponenten zugreifen darf, weil sie eben nicht threadsicher sind.

Lösung: Synchronize


Das ist wie überall ... Zugriffe auf gemeinsam genutzte Resourcen müssen irgendwie abgesichert werden.

Zitat:

Setzte ich dann "tTestform" vor das "Label1.Caption", klappt dies auch im Thread.
Hier hab ich jetzt garnicht verstanden, was du gemacht haben willst. (das was ich glaube da rauszulesen, das kann allerdings nicht funktionieren)


Und es ist immer wieder wunderschön, daß viele ständig das Wichtigste vergessen.
Zitat:

Fehlermeldung
Welche?

Man mag es nicht glauben, aber in diesen Dialogen funktioniert Strg+C und schon hat man die Fehlermeldung als Text im Speicher liegen.

Metschu 30. Jun 2014 18:51

AW: Thread und Form...
 
Zitat:

Zitat von himitsu (Beitrag 1263867)
Grundsätzlich wird man doch eigentlich in allen Thread-Tutoials darauf hingewiesen, daß man von einem Thread aus niemals auf VCL-Komponenten zugreifen darf, weil sie eben nicht threadsicher sind.

Lösung: Synchronize

oh, ok, muß ich wohl überlesen oder ausgeblendet haben...
Das ist dann wohl der Fehler.
Danke für den Tip.


Zitat:

Zitat von himitsu (Beitrag 1263867)
Zitat:

Setzte ich dann "tTestform" vor das "Label1.Caption", klappt dies auch im Thread.
Hier hab ich jetzt garnicht verstanden, was du gemacht haben willst. (das was ich glaube da rauszulesen, das kann allerdings nicht funktionieren)

Sorry, Tipfehler. Sollte nicht "tTestform" heißen, sondern "Testform", also

Delphi-Quellcode:
"Testform.label1.caption:=InToStr(i);
So klappt es.


Zitat:

Zitat von himitsu (Beitrag 1263867)
Und es ist immer wieder wunderschön, daß viele ständig das Wichtigste vergessen.
Zitat:

Fehlermeldung
Welche?

Der Vollständigkeit halber:

Im Projekt PSM_CAN.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x0055f207: read of address 0x000003d0' aufgetreten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 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