AGB  ·  Datenschutz  ·  Impressum  







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

Problem mit TImage

Ein Thema von calibra301 · begonnen am 29. Jun 2016 · letzter Beitrag vom 29. Jun 2016
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: Problem mit TImage

  Alt 29. Jun 2016, 12:04
Kurze Zwischenfrage zum Verständnis: Wieso ist die VCL-Ereignisbehandlungsroutine der UDP-Komponente als eigener Thread zu bewerten? Das klingt in meinen Ohren falsch.

Edith sah eben, es geht um Indy... carry on. Schön ist es dennoch nicht.
Mit INDY hat das nur nebensächlich etwas zu tun. Der Thread-Kontext in dem die Methoden aufgerufen werden wird nicht durch die Klasse festgelegt, sondern durch den Aufrufer der Methode.

Eine Server Komponente (idR für eine Verbindung zu 1+ Clients) läuft entweder sehr schlecht oder pro Client-Verbindung in einem Thread. Ob die Komponente jetzt von INDY oder wem auch immer ist, ist dabei egal
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#12

AW: Problem mit TImage

  Alt 29. Jun 2016, 12:16
Ich will den Thread nicht "hijacken" man möge mich also bremsen/zurechtweisen/strafen.
In diesem Beispiel geht es um UDP. Je nach Komponente ist die Implementierung eines UDP-Servers Multithreading in Eigenverantwortung (zB Indy) oder in Komponentenverantwortung (zB ICS). Nach meinem Verständnis der VCL ist letzteres eher der "Delphi-way". Das "blutige" ist weggekapselt, der Entwickler muss sich keine Gedanken darum machen. Darum mein "ach, es ist ja Indy".

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#13

AW: Problem mit TImage

  Alt 29. Jun 2016, 12:20
Ich wollte nur vorbeugen, falls jetzt der Eindruck (bei wem auch immer) entsteht, man müsste nur etwas anderes als Indy nehmen und dann bräuchte man kein Synchronisieren
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
calibra301

Registriert seit: 20. Mär 2009
95 Beiträge
 
Delphi XE8 Professional
 
#14

AW: Problem mit TImage

  Alt 29. Jun 2016, 12:26
Tja,

bei mir leider nix neues.
Wie gesagt, Komponente steht auf Treaded:=true

Verwende ich die "Syncroniz-Kapselung" wie in Sir Rufo´s Beispiel auf Seite 1 wird UDP Read nicht mehr
angesprungen.
  Mit Zitat antworten Zitat
calibra301

Registriert seit: 20. Mär 2009
95 Beiträge
 
Delphi XE8 Professional
 
#15

AW: Problem mit TImage

  Alt 29. Jun 2016, 13:40
Habs nur ein bisschen umgebaut:

Delphi-Quellcode:
procedure TForm1.ServerUDPRead(AThread: TIdUDPListenerThread;
   const AData: TIdBytes; ABinding: TIdSocketHandle);
begin

     TThread.Synchronize( nil,
     procedure
     begin
       setlength(Buffer,length(AData) );
       move(AData,Buffer,length(AData) );
       Do_Something;
     end );
end;
Nun wird hier nur der Empfangsbuffer in einen lokalen kopiert und dann in "Do Something"
ausgewertet.
Sende ich was per UDP hält das Programm in der Zeile TThread.Sync... einmal an
und dann nie wieder
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#16

AW: Problem mit TImage

  Alt 29. Jun 2016, 14:30
Warum willst du die Auswertung synchronisiert vornehmen?

Die Ausgabe an die Controls muss synchronisiert erfolgen, die Auswertung, etc. eher nicht (das ist da wurscht) bzw. eher hinderlich, weil jetzt jeder Empfangsthread den MainThread sehr lange blockiert und dann stehen sich alle auf den Füßen rum.

Stell dir vor du bist der Chef und deine Mitarbeiter bearbeiten emails. Es darf immer nur einer mit dir sprechen.

Jetzt öffnet jeder Mitarbeiter eine email und sucht das Gespräch mit dir (wartet höflich bis er an der Reihe ist), um dir die ganze email vorzulesen ... und dir ganz zum Schluss mitteilt, ob die nun für dich relevant ist oder nicht.

Wäre es nicht günstiger von der Zeit und für deine Ohren, wenn jeder Mitarbeiter die email erst einmal still und heimlich vor sich hin liest und dir nur eine kurze Rückmeldung gibt (wenn es wichtig ist)?

Du versuchst gerade die ungünstige Variante
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
calibra301

Registriert seit: 20. Mär 2009
95 Beiträge
 
Delphi XE8 Professional
 
#17

AW: Problem mit TImage

  Alt 29. Jun 2016, 18:33
Hi Rufo,

Denke das Problem ist das ich die Vorgehensweise / dem Sinn der Syncronisierung nicht verstanden hab.
Bin nicht so der Crack der das schon jahrelang macht.
Bei Themen wie Cortex M0/M7 könnte ich eher helfen. Da unter einem RTOS Threadprioritäten zu verteilen
oder mit dem NVIC zu arbeiten finde ich wesentlich logischer.

Bisher war mein Gedanke das wenn ich "Threaded" aktiviere der Empfang mehr oder weniger
unabhängig vom Rest läuft und ich trotz UDP nix verpasse.
Nun kopiere ich mir den Empfangspuffer in einen lokalen und murkse dann weiter.

Gruss
Calli
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#18

AW: Problem mit TImage

  Alt 29. Jun 2016, 19:16
Das passiert ja auch alles threaded, aber wenn du dieses schöne Nebeneinander wieder durch eine Synchronisierung in ein Hintereinander presst, dann hat es sich eben mit dem Nebeneinander erledigt.

Hier ein kleines Minimal-Beispiel:
Delphi-Quellcode:
procedure WillBeCalledFromAThread( foo: TFoo );
var
  i:Integer;
begin

  // ** Im Thread

  // Ganz was Aufwändiges berechnen
  Sleep( 5000 );
  // unser Ergebnis
  i := 1;

  // Das Ergebnis in der Form anzeigen, das dürfen wir aber nur synchronisiert
  TThread.Synchronize( nil,
    procedure
    begin

      // ** Im MainThread

      // Berechnung hier?
      // Sleep( 5000 ); // <- würde das Programm für den Benutzer für 5 Sekunden blockieren
      // also doof, lieber vorher berechnen, da stört es nicht

      MyForm.ListBox.Items.Add( IntToStr( i ) );
    end);

  // ** Im Thread

  // nochwas machen?
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (29. Jun 2016 um 19:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 06:55 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