![]() |
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? |
Re: TThread.Synchronize verwenden
Was noch nett wäre!
Die deklaration der Procedure und die stelle an der der Fehler entstand! |
Re: TThread.Synchronize verwenden
Die Fehlermeldung besagt, dass eine Methode verlangt, aber ein gewöhnlicher Prozedurzeiger geliefert wurde.
|
Re: TThread.Synchronize verwenden
hi,
also die prozedur sieht so aus:
Delphi-Quellcode:
Der Fehler kommt hier:
procedure TDatenTransfer.status(per : byte);
begin Form1.GProgress.Progress:=per; end;
Delphi-Quellcode:
ich weiss net mehr weiter.
...
Synchronize(status(0)); ... |
Re: TThread.Synchronize verwenden
Kuck mal in mein Thread-Tutorial, wie ich es gemacht habe:
![]() |
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. |
Re: TThread.Synchronize verwenden
genau da liegt das Problem. Wenn ich die MainForm bewege, scheint der Thread auszusetzen!
|
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:
|
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.
|
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