| Autor |
Beitrag |
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Mi 07.03.07 17:13
Versuch es doch mal so:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| TUDPThread = class(TTHread) private FRemoteHost : String; FText : String; protected procedure Execute; override; public Constuctor Create(ARemoteHost, AText : String); end;
constructor TUDPThread.Create(ARemoteHost, AText : String); begin inherited Create(True); FRemoteHost := ARemoteHost; FText := AText; FreeOnTerminate := True; Suspended := false; end;
procedure TUDPThread.Execute; begin with TUDPSockUtil.Create do try RemoteHost := FRemoteHost; SendText(FText); finally Free; end; end;
for User := 0 to frmMain.ListView1.Items.Count - 1 do TUDPThread.Create(frmMain.ListView1.Items[User].SubItems[1], Username + '#' + IntToStr(User)); |
Das ist wieder nur ein Ansatz (ehe sich jemand beschwert  ), könnte aber nach meinem Verständniss funktionieren
gruss, Rob
_________________ erare humanum est
|
|
Yheeky
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 07.03.07 17:36
So, mein Programm sieht nun so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| constructor TUDPThread.Create(VPort : Integer; VRemoteHost : String); var UDPSockUtil : TUDPSockUtil; begin inherited Create(True); CLocalPort := VPort; CRemoteHost := VRemoteHost;
UDPSockUtil := TUDPSockUtil.Create(frmMain); UDPSockUtil.LocalPort:= VPort; UDPSockUtil.RemoteHost := VRemoteHost; Suspended := False;
end; |
Der Aufruf ist wiefolgt (bei OnButtonClick):
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| for User := 0 to Users.Items.Count - 1 do begin Application.ProcessMessages;
TUDPThread.Create(Port, Users.Items[User].SubItems[0]); end; |
Trotzdem kann ich die Form nicht bewegen, wenn ich den Button drücke...  wieso denn? Ich richte die Komponente ja bisher nur ein und Connecte nicht.
EDIT: Okay, auch wenn sich die Komponente nicht verbindet, versucht er schon beim Eintragen den Namen aufzulösen. Nichtsdestotrotz möchte ich den "Einfrieren" Effekt hierbei ja nicht haben...
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Mi 07.03.07 17:44
du erstellst UDPSockUtil in konstruktor als lokale Variable. Das hat erstens keinen SInn, weil du im Execute darauf nichtmehr zugreifen kannst und zweitens wird der Creator nicht Asynchron ausgeführt. Nimm das da mal raus und versuch es dann nochmal  . Das UDPSockUtil wird ja im Execute eh schon erstellt.
gruss, rob
_________________ erare humanum est
|
|
Yheeky
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 07.03.07 18:14
Ah, okay
Aber der Code...
Delphi-Quelltext 1: 2: 3: 4:
| UDPSockUtil := TUDPSockUtil.Create(frmMain); UDPSockUtil.LocalPort:= VPort; UDPSockUtil.RemoteHost := VRemoteHost; |
...wird doch dann ins Execute gestellt oder? Ansonsten weiss Execute ja garnicht, dass er ne Komponente vom Typen TUDPSockUtil erstellen soll...
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Mi 07.03.07 18:37
_________________ erare humanum est
|
|
Yheeky
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 07.03.07 18:48
Okay, aber angenommen das würde nicht im Execute stehen...dann würde doch auch meine Variante funktionieren oder was spricht dagegen?
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Mi 07.03.07 18:51
Habn ich doch eben schon gesagt. Der Konstruktor wird nicht asynchron ausgeführt... da kannst du es genauso gut im Mainthread laufen lassen.
_________________ erare humanum est
|
|
Yheeky
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 07.03.07 18:58
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Mi 07.03.07 19:51
Das is beides ansich das gleiche. Nur hast du kein SendText drinne und gibst das Objekt nicht wieder frei ;)
Zudem solltest du nicht frmMain als Owner übergeben
gruss, Rob
Ps.: wo siehst du da ein while..do und wo ein TObject?
_________________ erare humanum est
|
|
Yheeky
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 07.03.07 19:58
Verlesen...meinte natürlich das with...do und mit TObject meinte ich die UDP Kompo...okay, dann danke erstmal. Ich schau mal wie weit ich komme, ehe ich mich hier wieder melden muss
Danke nochmal!
Gruß Christian
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mi 07.03.07 23:57
Moin!
Ich möchte nochmal auf die allgemeinen Fragen eingehen, das mit dem (Sende-)Thread hat dir Robinator ja nun schon hingebogen:
Yheeky hat folgendes geschrieben: | Okay, also sollte ich vielleicht erstmal versuchen die Hostauflösung in einen Thread zu machen oder? Dann sollte das mit dem Einfrieren schonmal weg sein.
Die allgemein schlechte Performance liegt dann also daran, dass alles über eine Komponente läuft, richtig? |
Je länger ich so darüber nachdenke, desto mehr frage ich mich, WARUM die Hostnamensauflösung bei dir sooo lange dauern sollte, dass die einzelnen GetHostByName()-Calls derartige Blockaden bewirken...  vor allem, weil nachfolgende Auflösungen aus dem lokalen DNS-Cache bedient werden. Ausser(!): es handelt sich um einen fehlerhaften Hostnamen oder du hast eine Fehlkonfiguration in deiner DNS-Anbindung...  das würde es erklären!
Der Ansatz mit den Sende-Threads ist zwar ein Workaround für das Problem, aber es geht eigentlich nicht auf die Ursache ein. Wenn alle Hosts, die du in deiner Liste hast, gültig sind, dann sollte die erste Auflösung vielleicht etwas dauern, aber alle folgenden nicht (wohlgemerkt, die erste Auflösung innerhalb von 24 Stunden(?) oder so! jedenfalls innerhalb der lokalen Cach-Dauer). Ich frage mich also ernsthaft, ob du nicht vielleicht ein anderes, grundlegendes Problem hast und jetzt nur daran "vorbeiprogrammierst"...
Yheeky hat folgendes geschrieben: | | Ich kann natürlich für jede Verbindung einen neuen UDPSockUtil anlegen, nur wird das Ereignis OnReceiver dann ja für jede Komponente abgefragt. Sorgt das dann nicht auch für eine Programmüberlastung? |
Für den Empfang musst du natürlich weiterhin die statische IDE-Kompo auf dem Formular verwenden.  Aber du hast natürlich Recht mit der "Befürchtung", dass der Sende-Thread-Ansatz nicht gerade eine resourcensparende "Alternative" ist...
Deshalb: du solltest IMHO versuchen, die Ursache für die lange DNS-Auflösung zu finden; oder vielleicht ist es ja noch ganz was anderes... ? Fazit: Das mit dem Sende-Thread mag zwar "funktionieren", aber deshalb halte ich den Ansatz immer noch nicht für "sauber".
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Yheeky
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 08.03.07 00:17
Also die Sache ist: bei mir zuhause hat das alles schon reibungslos funktioniert. In der Berufsschule habe ich es dann versucht und da ist das Programm eingefroren. Das Netzwerk ist ziemlich groß und so kam ich schon dazu, dass ich vom Broadcasting auf das direkte Senden umgestiegen bin.
Nochmal eine Frage:
Mit folgendem Code versuche ich eine Komponente zu erzeugen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| constructor TUDPThread.Create(VRemoteHost : String; VIndex : Integer); begin inherited Create(True); CRemoteHost := VRemoteHost; CIndex := VIndex; FreeOnTerminate := True; Suspended := False;
end;
procedure TUDPThread.Execute; begin with TUDPSockUtil.Create(Application) do try Name := 'UDPClient' + IntToStr(CIndex); LocalPort := 3110; RemoteHost := CRemoteHost; finally Free; end;
end; |
Dann habe ich 2 Buttons. Mit dem einen erstelle ich eine Komponente und mit dem anderen frage ich ab, ob es eine Komponente mit dem Namen gibt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm10.Button1Click(Sender: TObject); begin if CompExists('UDPClient0') = True then ShowMessage('Existiert') else ShowMessage('Existiert nicht');
end;
procedure TForm10.Button2Click(Sender: TObject); begin TUDPThread.Create('', 0);
end; |
Hier dann noch die CompExists-Funktion:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| function CompExists(Componentname : String) : Boolean; var Comp : SmallInt; begin Result := False;
for Comp := 0 to Application.ComponentCount-1 do if Application.Components[Comp] is TUDPSockUtil then if TUDPSockUtil(Application.Components[Comp]).Name = ComponentName then Result := True;
end; |
Ich bekomme jedoch immer angezeigt, dass eine Komponente mit dem Namen nicht existiert 
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 08.03.07 00:23
Moin!
Augenblick mal (den Rest des Beitrags habe ich mir noch nicht genau angesehen, kommt noch); du willst damit sagen:
Yheeky hat folgendes geschrieben: | | Also die Sache ist: bei mir zuhause hat das alles schon reibungslos funktioniert. In der Berufsschule habe ich es dann versucht und da ist das Programm eingefroren. Das Netzwerk ist ziemlich groß und so kam ich schon dazu, dass ich vom Broadcasting auf das direkte Senden umgestiegen bin. |
dass du Broadcasts gesendet hast und das hat lange gedauert? Also, da ist was faul, einen Broadcast zu senden ist das schnellste, was geht, da hier gar keine DNS-Auflösung gemacht wird!  Sprich: von Broadcasts auf Unicasts umzusteigen ist sicher keine Verbesserung (zumindest im LAN, per INet gehts natürlich nicht anders)!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 08.03.07 00:29
Moin!
So, hab jetzt auch mal über den Code geschaut, aber, ähm, ...  wie sag ich´s diplomatisch, ... das ist nix...  Den kannste (und den gedanklichen Ansatz/Idee gleich mit) in die Tonne tun.  (bitte nicht persönlich nehmen).
Sag mal, kennst du dieses Tutorial?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Yheeky
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 08.03.07 10:13
Okay, danke für das Tutorial...ich muss zu meiner Schande gestehen, dass ich jetzt erst beim Nachschauen gesehen habe, dass du ja die Komponente geschrieben hast
Bezüglich dem Broadcast: Wie du schon mal erwähnt hattest, liegt das Problem womöglich woanders. Zum Verständnis vielleicht nochmal genaueres über mein Programm. Ich möchte einen Messenger für meine Klasse in der Berufsschule schreiben. Den habe ich zuhause schonmal getestet und da hat soweit alles funktioniert. In der Schule kam dann allerdings das "Einfrier-Phänomen". Wielange dürfte es denn dauern, wenn ich eine Nachricht in ein Netzwerk schicke (selbst wenn die Maske 255.255.255.255 ist)?
Mhmm, jetzt machst du aber meine Motivation runter  ...ich bin gerade noch in der Schule, schau aber vielleicht gleich schonmal ins Tutorial rein. Ich hoffe dann bin ich etwas schlauer. Welcher Teil von dem Code ist denn nun aber eigentlich schlecht, denn ein gewisser Teil stammte ja auch von dir 
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 08.03.07 12:29
Moin!
Yheeky hat folgendes geschrieben: | ich muss zu meiner Schande gestehen, dass ich jetzt erst beim Nachschauen gesehen habe, dass du ja die Komponente geschrieben hast  |
Yheeky hat folgendes geschrieben: | | Zum Verständnis vielleicht nochmal genaueres über mein Programm. Ich möchte einen Messenger für meine Klasse in der Berufsschule schreiben. |
Vorab und eigentlich OT, aber trotzdem wichtig: Mir ist ein Fall bekannt, wo der Einsatz eines Chat-Programms in einer Berufsschule (klar, ohne Wissen des Lehrers im Unterricht) zu recht "drastischen Maßnahmen" ggü. den SuS geführt hat...  Ich hoffe (für dich), dass du weißt, was du da machst!
Yheeky hat folgendes geschrieben: | | Bezüglich dem Broadcast: Wie du schon mal erwähnt hattest, liegt das Problem womöglich woanders. [...] In der Schule kam dann allerdings das "Einfrier-Phänomen". Wielange dürfte es denn dauern, wenn ich eine Nachricht in ein Netzwerk schicke (selbst wenn die Maske 255.255.255.255 ist)? |
Oo, das sieht nicht gut aus; mir scheint, die Rechner in eurer Schule sind nicht korrekt konfiguriert...  Mach mal ein ipconfig /all 1>C:\ipconfig.txt 2>&1 an einem und pack mal die Ausgabe hier rein (ggfs. als PN, wenn du das nicht öffentlich machen willst).
Yheeky hat folgendes geschrieben: | Mhmm, jetzt machst du aber meine Motivation runter ...
[...]
Welcher Teil von dem Code ist denn nun aber eigentlich schlecht, denn ein gewisser Teil stammte ja auch von dir  |
Hm, ich sehe in dem Thread keinen Code von mir (OK, mit Ausnahme der Kompo  )?! Wie ich schon sagte, der Ansatz scheint mir das Problem zu sein.
Aber mach mal die Abfrage und das Tut, dann sehen wir weiter.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Yheeky
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 08.03.07 13:35
Narses hat folgendes geschrieben: | Moin!
Vorab und eigentlich OT, aber trotzdem wichtig: Mir ist ein Fall bekannt, wo der Einsatz eines Chat-Programms in einer Berufsschule (klar, ohne Wissen des Lehrers im Unterricht) zu recht "drastischen Maßnahmen" ggü. den SuS geführt hat... Ich hoffe (für dich), dass du weißt, was du da machst!  |
Hab ich eigentlich noch nichts von gehört. Was ist den SuS? Was waren das denn für Maßnahmen?
Narses hat folgendes geschrieben: | Oo, das sieht nicht gut aus; mir scheint, die Rechner in eurer Schule sind nicht korrekt konfiguriert... Mach mal ein ipconfig /all 1>C:\ipconfig.txt 2>&1 an einem und pack mal die Ausgabe hier rein (ggfs. als PN, wenn du das nicht öffentlich machen willst). |
Gerade passiert
Narses hat folgendes geschrieben: | Hm, ich sehe in dem Thread keinen Code von mir (OK, mit Ausnahme der Kompo )?! Wie ich schon sagte, der Ansatz scheint mir das Problem zu sein.
Aber mach mal die Abfrage und das Tut, dann sehen wir weiter.  |
Also das Tutorial sieht schonmal vielversprechend aus. Das Demoprogramm funktioniert auch und das sogar in der Schule! Muss ich den gleichen Aufbau nur noch in meinem Programm verwenden.
|
|
Narses
      

Beiträge: 10185
Erhaltene Danke: 1261
W11x64
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 08.03.07 14:17
Moin!
Yheeky hat folgendes geschrieben: | Narses hat folgendes geschrieben: | Moin!
Vorab und eigentlich OT, aber trotzdem wichtig: Mir ist ein Fall bekannt, wo der Einsatz eines Chat-Programms in einer Berufsschule (klar, ohne Wissen des Lehrers im Unterricht) zu recht "drastischen Maßnahmen" ggü. den SuS geführt hat... Ich hoffe (für dich), dass du weißt, was du da machst!  |
Hab ich eigentlich noch nichts von gehört. Was ist den SuS? Was waren das denn für Maßnahmen? |
Schülerinnen und Schüler  Schriftliche Verwarnung für alle an den Ausbilder und der "Urheber der Idee" wurde 1 Woche vom Unterricht ausgeschlossen...  (und IMHO auch völlig zu recht!  -> 1. unerlaubter Softwareeinsatz, 2. Betrugswerkzeug, 3. Sabotage an der Schuleinrichtung; Berufsschule ist keine Fun-Veranstaltung, das ist schon halb Job, und da wird nach der Pfeife des Lehrers/Ausbilders getanzt, Punktum!)
Yheeky hat folgendes geschrieben: | Gerade passiert  |
Jau, sieht auch nicht auffällig aus; die anderen Schnittstellen sind ja nicht verbunden und die Verbundene hat eine korrekte Konfiguration. Also, alles OK.
Yheeky hat folgendes geschrieben: | | Also das Tutorial sieht schonmal vielversprechend aus. Das Demoprogramm funktioniert auch und das sogar in der Schule! |
Scheint mir also eher, als hättest du "nur" die Kompo unglücklich "Angefasst" oder sowas.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Robinator
      
Beiträge: 275
WinXP
BDS 2006
|
Verfasst: Do 08.03.07 16:04
[quote=" Narses"]Moin!
Narses hat folgendes geschrieben: | Schriftliche Verwarnung für alle an den Ausbilder und der "Urheber der Idee" wurde 1 Woche vom Unterricht ausgeschlossen... (und IMHO auch völlig zu recht! -> 1. unerlaubter Softwareeinsatz, 2. Betrugswerkzeug, 3. Sabotage an der Schuleinrichtung; Berufsschule ist keine Fun-Veranstaltung, das ist schon halb Job, und da wird nach der Pfeife des Lehrers/Ausbilders getanzt, Punktum!)
|
Ähm ja... Sabotage.. klar sicher doch. Ich bin ja der Meinung, dass man Schüler für sowas gleich erschiessen sollte
Gruss, rob
_________________ erare humanum est
|
|
Yheeky
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 08.03.07 16:16
Narses hat folgendes geschrieben: | Schülerinnen und Schüler Schriftliche Verwarnung für alle an den Ausbilder und der "Urheber der Idee" wurde 1 Woche vom Unterricht ausgeschlossen... (und IMHO auch völlig zu recht! -> 1. unerlaubter Softwareeinsatz, 2. Betrugswerkzeug, 3. Sabotage an der Schuleinrichtung; Berufsschule ist keine Fun-Veranstaltung, das ist schon halb Job, und da wird nach der Pfeife des Lehrers/Ausbilders getanzt, Punktum!) |
Also im Grunde genommen hast du da schon recht, aber er ist auch für nützliche Sachen gedacht wie z.B. Mitschriften am Laptop können per Datei rübergeschickt werden. Erst aber mal sollte das generelle Prinzip funktionieren
Also während Arbeiten oder so ist das Ding natürlich tabu und ich denke auch eher, dass wir da als IT-Klasse unterstützt werden, wenn wir uns mit dem Thema Netzwerk auseinander setzen.
Narses hat folgendes geschrieben: | Scheint mir also eher, als hättest du "nur" die Kompo unglücklich "Angefasst" oder sowas.  |
Ja scheint ja so, sonst wäre dein Beispiel ja nicht gegangen. Also brauche ich ja doch nur eine Komponente und nen Thread hast du in deinem Programm auch nicht drin...
|
|