AW: For-Schleife im Thread wird nur einmal abgearbeitet
Zitat:
Ich weiß ja nicht wie ud wo die die Instanz deines Threads gespeichert hast, aber das ist ja egal, da der Sender immer passt und man die Instanz somit auch da auslesen kann. Man muß halt nur das TObject in den richtigen Typen casten, wenn man das verwendet. Ergebnis: Du erstellst dir eine passende Methode, rufst darin das Syncronize und auf darin dann den genannten Code. Und nun natürlich nur noch das Event dem Thread zuweisen.
Delphi-Quellcode:
procedure TDeineForm{oder dein TThread-Nachfahre}.MyThreadTerminate(Sender: TObject);
begin // TThread(Sender).Synchronize nehm ich jetzt mal nicht, da der Thread ja eigentlich schon beendet ist // und ich jetzt nicht genau weiß, ob was passieren könnte, auch wenn es vermutlich doch funktionieren könnte TThread.Synchronize(nil, procedure begin if Assigned(TThread(Sender).FatalException) then ShowException(Exception(TThread(Sender).FatalException), nil); end); end; PS: Wäre es nicht besser, wenn dein WriteLog im inneren prüft, ob es im Hauptthread läuft und sich notfalls selber synchroonisiert? (oder notfalls einfach immer blind synchronisieren ... das Synchronize prüft das intern bestimmt auch selber nochmal) Würde das Logging vereinfachen und so einige Codezeilen sparen. |
AW: For-Schleife im Thread wird nur einmal abgearbeitet
Wird der TCPClient im Thread-Kontext erzeugt? Achtung: Im Thread-Konstruktor erzeugte Dinge sind nicht im Thread-Kontext, sondern in dem des Hauptthreads!!! Die meisten Komponenten, die irgendwie mit Sockets und ähnlichen WinAPIs hantieren sind oft nur in dem Kontext zu benutzen, in dem sie auch erstellt wurden. Ich bin damit schon mal mit SQL-Komponenten übel auf die Nase gefallen. Du musst diese in der Execute-Methode erstellen.
Dies ist zumindest eines der potenziellen Probleme die mir noch aufgefallen sind, das andere wurde schon genannt. |
AW: For-Schleife im Thread wird nur einmal abgearbeitet
Zitat:
Möglicherweise besteht die Beschränkung (Verwendung nur im erzeugenden Thread) bei plattformgebundenen Komponenten wie ICS, die ein Windows Fensterhandle benötigen - aber mit ICS habe ich zuletzt 2008 kurz Kontakt gehabt. |
AW: For-Schleife im Thread wird nur einmal abgearbeitet
Zitat:
Wobei diesesa andauernde Zugriff auf frm_main (und dann auch noch globale Variable :roll:) sagen wir mal: potential zur Verbesserung bietet. |
AW: For-Schleife im Thread wird nur einmal abgearbeitet
Zitat:
Zitat:
Ich kenne bisher nur die Möglichkeit Daten an den Hauptthread mit Synchronize sicher zu übergeben. Geht das mit Funktionen auch? Ich kenne das nur mit procedure. |
AW: For-Schleife im Thread wird nur einmal abgearbeitet
Zitat:
Delphi-Quellcode:
FCS.Acquire;
// nicht synchronisierter Zugriff auf eine VCL-Komponente for I := 0 to frm_main.lv_waagen.Items.Count-1 do begin Synchronize( Procedure begin // hier ist es synchronisiert frm_main.Writelog('Sende Register '+inttostr(i)+' von '+inttostr(frm_main.lv_waagen.Items.Count-1)); end ); FTCPClient.SendCmd('Register:'+frm_main.lv_waagen.Items[i].SubItems[2]+':@'); end; FCS.Release; Zitat:
|
AW: For-Schleife im Thread wird nur einmal abgearbeitet
Zitat:
Gut, ich sollte vielleicht die gesamte Schleife synchronisieren. Zitat:
Möglicherweise geht das nur über Messages. |
AW: For-Schleife im Thread wird nur einmal abgearbeitet
Weiterleiten und empfangen hört sich gut an, dann mach das doch auch so.
Der Thread empfängt aber z.B. nicht, sondern greift lustig in die GUI und bedient sich. Ein Control missbraucht man auch nicht als Datenspeicher, sondern als interaktives Element zum Anzeigen und Erfassen. |
AW: For-Schleife im Thread wird nur einmal abgearbeitet
Zitat:
Die For-Schleife liest erst alles aus und speichert sich den End-Wert zwischen. Die Start- und End-Werte werden also immer nur einmal zu Beginn abgerufen. Manchmal läuft die Schleife "intern" sogar rückwärts, da ein Vergleich mit 0 einfacher ist und man sich dafür nicht den Endwert extra speichern muß. |
AW: For-Schleife im Thread wird nur einmal abgearbeitet
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:14 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