Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TThread.Synchronize verwenden (https://www.delphipraxis.net/16600-tthread-synchronize-verwenden.html)

Manzoni 19. Feb 2004 20:02


TThread.Synchronize verwenden
 
hi,

ich komme nicht weiter mit meinem Thread. Ich will gerne an eine Thread-Prozedur ein Parameter übergeben. Leider meldet Delphi dann immer
Code:
[Fehler] UThread.pas(100): Inkompatible Typen: 'TThreadMethod' und 'procedure, untyped pointer or untyped parameter'


Wie kann ich das realisieren?

neolithos 19. Feb 2004 20:06

Re: TThread.Synchronize verwenden
 
Was noch nett wäre!

Die deklaration der Procedure und die stelle an der der Fehler entstand!

Chewie 19. Feb 2004 20:25

Re: TThread.Synchronize verwenden
 
Die Fehlermeldung besagt, dass eine Methode verlangt, aber ein gewöhnlicher Prozedurzeiger geliefert wurde.

Manzoni 20. Feb 2004 22:26

Re: TThread.Synchronize verwenden
 
hi,

also die prozedur sieht so aus:
Delphi-Quellcode:
procedure TDatenTransfer.status(per : byte);
begin
  Form1.GProgress.Progress:=per;
end;
Der Fehler kommt hier:
Delphi-Quellcode:
...
Synchronize(status(0));
...
ich weiss net mehr weiter.

Luckie 20. Feb 2004 22:29

Re: TThread.Synchronize verwenden
 
Kuck mal in mein Thread-Tutorial, wie ich es gemacht habe: http://www.luckie-online.de/tutorials/threads/

stoxx 20. Feb 2004 23:01

Re: TThread.Synchronize verwenden
 
synchronize kannst Du nicht mit paramentern aufrufen.
Wenn Du dies willst, musst Du eine Objectvariable anlegen, in der Deine informationen speichern, und dann in der status Procedure die Variablen benutzen.

Manzoni 21. Feb 2004 16:10

Re: TThread.Synchronize verwenden
 
genau da liegt das Problem. Wenn ich die MainForm bewege, scheint der Thread auszusetzen!

stoxx 21. Feb 2004 17:26

Re: TThread.Synchronize verwenden
 
synchronize unterbricht den Thread und führt alle Anweisungen im Haupthread auf.
Grund dieser Übung ist der, das die VCL nicht threadsicher programmiert wurde. Und zugriffe von zwei verschiedenen Threads zu unvollständig geschriebenen Variablen führen, und es dann meistens irgendwo abstürzt.
Threads werden in ihrer Ausführung von Windows einfach unterbrochen, auch wenn sie gerade eine "halbe" Variable geschrieben haben. Und wenn sie wieder eine Zeitscheibe bekommen machen sie dort weiter, wo sie aufgehört haben.
Mit einem einzigen Thread ist das natürlich kein problem, wenn aber ein zweiter Thread diese Variable dann benutzen will kommt es zu ungültigen nicht sinnvollen Werten.
Wenn Du aber mit einer eigenen Objectstruktur arbeitest, kannst Du diese Threadsicher gestalten.
(critical Sections usw.)

Ziel sollte also sein, die Anweisungen in synchronize so gering wie möglich zu halten.
(Denn dazu is ja sicherlich der Thread da, sonst hätte der Thread ja keinen Sinn)

Zitat:

Zitat von Manzoni
Wenn ich die MainForm bewege, scheint der Thread auszusetzen!

da hast einen Fehler drin ..

Luckie 21. Feb 2004 17:42

Re: TThread.Synchronize verwenden
 
woher weiß0t du, dass der Thread anhält? Während du verschiebst wird wohl nichts mehr aktualisiert, weil das fenster gerade mit Neuzeichnen beschäftig ist und so die Fortschrittsanzeige nicht aktualisieren kann.

Manzoni 22. Feb 2004 02:38

Re: TThread.Synchronize verwenden
 
hiho,

ich verwende im Thread ein ClientSocket um eine Datei zu versenden. Im Thread gibt es eine private Funktion, die den prozentualen Fortschritt berechnet. Die Prozedur Status soll dann diesen Wert auf die MainForm liefern. Funktioniert auch alles super, nur wenn ich die MainForm bewege während des sendens, kommt beim Server nicht alles an! Ich habe bereits probiert den Wert erst im Thread zu berechnen, diesen dann in einer privaten Variable zu speichern und diesen Wert dann in der Prozedur Status mit synchronize auszugeben. Ebenfalls habe ich in der Prozedur Status die Funktion direkt aufgerufen. Bei beiden Varianten gab es den Fehler. Deshalb will ich den Prozentwert jetzt als Parameter übergeben, was nicht funktioniert. Wo liegt der Fehler?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:19 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz