AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms
Thema durchsuchen
Ansicht
Themen-Optionen

Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms

Offene Frage von "Darkface"
Ein Thema von Darkface · begonnen am 9. Dez 2010 · letzter Beitrag vom 13. Dez 2010
Antwort Antwort
Darkface

Registriert seit: 18. Apr 2008
89 Beiträge
 
Delphi XE Professional
 
#1

Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms

  Alt 9. Dez 2010, 16:56
Hiho DP'ler,

Ich bin gerade etwas ratlos und hoffe ihr habt eine Idee zur Lösung meines Problems .

Ich habe ein kleines IRC Client Programm per Indy TidIRC geschrieben. Es hat eine (Main)Form, dort wird die Verbindung aufgebaut und ein kleines Status Fenster zeigt an wie der Connection-Status ist. Nun soll für jeden Channel dem ich beitrete ein weiteres Fenster aufgehen. Auf diese dynamisch zur Laufzeit erstellen Forms haue ich noch je ein Panel und ein Memo drauf. Später will ich dann jede Nachricht die ankommt dem richtigen Fenster zuweisen und in dessen Memo ausgeben. Doch schon davor gibt es ein Problem. Bisher werden nur die Fenster+Panel+Memo erstellt, die Nachrichten die ankommen werden noch im "Main-Form-Memo" ausgegeben. Sobald die Fenster erstellt sind friert das Programm ein. Wenn ich zum Beispiel eines der Fenster verschieben möchte passiert nichts. Sobald jedoch eine Nachricht hereinkommt und ausgegeben wird werden alle Bewegungen vollzogen, danach friert wieder alles ein bis zur nächsten Nachricht. Wie kann ich das verhindern und ein verschieben der Forms sofort vollziehen?

TidAntiFreeze macht seinem Namen nicht alle Ehre und bringt hier nichts.

Ein wenig Code...:
Das hier steht in einer Schleife, die dynamische Erstellung der benötigten Fenster.
Delphi-Quellcode:
    setlength(Forms,length(Forms)+1);
    Forms[length(Forms)-1]:=TForm.Create(self);
    with Forms[length(Forms)-1] do begin
        ClientWidth:=Form1.ClientWidth;
        ClientHeight:=Form1.ClientHeight;
        Color:=clGreen;
        Caption:='Immer wieder Sonntags...';
        Visible:=True;
        Show;
    end;

    setlength(Panels,length(Panels)+1);
    Panels[length(Panels)-1]:=TPanel.Create(Forms[length(Forms)-1]);
    with Panels[length(Panels)-1] do begin
        Width:=Forms[length(Forms)-1].ClientWidth;
        Height:=Forms[length(Forms)-1].ClientHeight;
        Color:=clGreen;
        Enabled:=True;
        Visible:=True;
        Parent:=Forms[length(Forms)-1];
    end;

    setlength(Memos,length(Memos)+1);
    Memos[length(Memos)-1]:=TMemo.Create(Panels[length(Panels)-1]);
    with Memos[length(Memos)-1] do begin
        Width:=Forms[length(Forms)-1].ClientWidth;
        Height:=Forms[length(Forms)-1].ClientHeight;
        Color:=clGreen;
        Visible:=True;
        Parent:=Panels[length(Panels)-1];
    end;
Die Ausgabe einer Nachricht auf der MainForm
Delphi-Quellcode:
procedure TForm1.PrivMsg(ASender: TIdContext; const ANicknameFrom, AHost, ANicknameTo, AMessage: string);
var Nickname, Nachricht:string;
begin
  Application.ProcessMessages;
  Nickname:=ANicknameFrom;
  delete(Nickname,1,1); //Nickname von LEERZEICHEN befreien
  Nachricht:=copy(MsgText,2,pos(' :',MsgText)-1); //MsgText wird in TForm1.ReciveRaw befüllt
  delete(MsgText,1,pos(' :',MsgText)+1); //und bearbeitet
  Ausgabe.Lines.Add(ANicknameTo +' / '+Nickname +': ' +MsgText); //Ausgabe ist ein TMemo
end;
Jemand eine Idee wo der Fehler/das Problem liegen könnte?

MfG Dark
Alexander
Ich halte Ordnung.
Zum Beispiel mein Schreibtisch: Hier ist alles zeitlich geordnet - was zuletzt kam, liegt oben. (Frank Erhoff)

Geändert von Darkface ( 9. Dez 2010 um 17:10 Uhr)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#2

AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms

  Alt 10. Dez 2010, 13:04
Alle Indy Komponenten arbeiten im Blocking-Modus. Solange sie auf eine Message warten, ist die Anwendung gerne mal blockiert. Schaue Dir doch mal TIdAntiFreeze an oder verlege die Indy-Komponenten in einen eigenen Thread.

Geändert von samso (10. Dez 2010 um 13:07 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms

  Alt 10. Dez 2010, 13:47
Zitat:
Das hier steht in einer Schleife, die dynamische Erstellung der benötigten Fenster.
Kannst du mal die komplette Schleife inklusive des Schleifenkopfes zeigen? Wie lange läuft denn die Schleife und werden innerhalb der Schleife auch Windows-Nachrichten abgearbeitet?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Darkface

Registriert seit: 18. Apr 2008
89 Beiträge
 
Delphi XE Professional
 
#4

AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms

  Alt 12. Dez 2010, 13:14
Alle Indy Komponenten arbeiten im Blocking-Modus.
TIdAntiFreeze habe ich schon drin, (Created und dann auf Active geschaltet). Gibt es bei IDAntiFreeze / IDIrc denn Möglichkeiten die Komponenten auf Non-Blocking zu stellen?

Kannst du mal die komplette Schleife inklusive des Schleifenkopfes zeigen? Wie lange läuft denn die Schleife und werden innerhalb der Schleife auch Windows-Nachrichten abgearbeitet?
Würde ich dir zeigen, habe aber den Code auf dem zweit Rechner den ich erst heut abend wiedersehe ^^. Jedoch kann ich dir sagen das die Schleife ausgeführt wird wenn IRC die "end of /MOTD" Zeile vom Server empfängt. Also nur einmal je IRC-Connect. Sie läuft dann exakt die Anzahl an durchgängen wie es Channel gibt denen gejoint werden soll. On ein ProcessMessages drin ist weis ich nicht, allerdings läuft die Schleife ja nur ein paar Millisekunden - das wird nicht diese Freezes erklären. (Beim Schrittweisen Debuggen ist er auch ordnungsgemäß nach x Durchläufen aus dieser Schleife rausgegangen.)
Alexander
Ich halte Ordnung.
Zum Beispiel mein Schreibtisch: Hier ist alles zeitlich geordnet - was zuletzt kam, liegt oben. (Frank Erhoff)
  Mit Zitat antworten Zitat
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms

  Alt 13. Dez 2010, 09:14
Hi,

Zitat:
Gibt es bei IDAntiFreeze / IDIrc denn Möglichkeiten die Komponenten auf Non-Blocking zu stellen?
Nein, Indy arbeitet nunmal mit Blocking Sockets und ich für meinenTeil finde das auch gut so !

Hast Du schonmal bei Deinem Antifreeze die Eigenschaft ApplicationHasPriority=true und OnlyWhenIdle=false gesetzt ?

Die definitiv bessere Variante ist wie schon weiter oben vorgeschlagen die Kommunikation des Clients in einen Thread auszulagern.

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
Sailor

Registriert seit: 20. Jul 2008
Ort: Balaton
112 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms

  Alt 13. Dez 2010, 14:32
Hi,
Parent ist m.M. nicht gesetzt.
Nach dem Erstellen einer Komponente
muß die ja irgendwo eingehängt werden.
Parent.Panel = kreierte Form, Parent
der Form = MainForm.
  Mit Zitat antworten Zitat
Darkface

Registriert seit: 18. Apr 2008
89 Beiträge
 
Delphi XE Professional
 
#7

AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms

  Alt 13. Dez 2010, 16:39
Hast Du schonmal bei Deinem Antifreeze die Eigenschaft ApplicationHasPriority=true und OnlyWhenIdle=false gesetzt?
Diese Eigenschaften haben keine Verbesserung erbracht.

Die definitiv bessere Variante ist wie schon weiter oben vorgeschlagen die Kommunikation des Clients in einen Thread auszulagern.
Ja da gehe ich auch mit, wäre natürlich schön gewesen das mit nem Antifreeze - zwei Zeiler zu lösen. Werde den ganzen IDIrc in einen Thread schmeißen.
Alexander
Ich halte Ordnung.
Zum Beispiel mein Schreibtisch: Hier ist alles zeitlich geordnet - was zuletzt kam, liegt oben. (Frank Erhoff)
  Mit Zitat antworten Zitat
Darkface

Registriert seit: 18. Apr 2008
89 Beiträge
 
Delphi XE Professional
 
#8

AW: Kurzzeitiges Einfrieren der Anwendung nach Erstellung dynamischer Forms

  Alt 13. Dez 2010, 21:19
Tja ich musste gerade feststellen das es an den dynamischen Forms liegt . Hau ich die Raus läuft das Programm freeze-frei - egal ob ich IdIRC auslager oder nicht. Sobald ich die Forms erstelle gehts steil bergab. Wie kann ich das lösen? Die Forms in einen eigenen Thread hauen geht wohl angeblich nicht weil die VCL nicht Threadsafe ist (hab ich gelesen). Kann das jemand bestätigen?

EDIT: Mit neuen zur Designzeit erstellten Forms freezt es leider genauso.
Alexander
Ich halte Ordnung.
Zum Beispiel mein Schreibtisch: Hier ist alles zeitlich geordnet - was zuletzt kam, liegt oben. (Frank Erhoff)

Geändert von Darkface (13. Dez 2010 um 22:56 Uhr) Grund: Edit
  Mit Zitat antworten Zitat
Antwort Antwort


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 12:00 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