Laden...

Zweite WinForm erstellen -> reagiert nicht

Letzter Beitrag vor 14 Jahren 18 Posts 2.865 Views
Zweite WinForm erstellen -> reagiert nicht

hallo leute,

hab heute eine recht seltsame erfahrung machen müssen.
ich hab ein windows prog(winforms) dabei habe ich eine form, diese reagiert auf ein ereignis und soll beim auftreten dieses ereignisses ein zweites form erstellen und zeigen.

es klappt alles so weit ganz gut. nur wenn das zweite fenster angezeigt werden soll, reagiert es von anfang an nicht. auch wenn dort keinerlei verarbeitungslogik drin ist. nur allgemeine sachen, die das design bestimmen.

wenn ich das relativ lange in dem zustand lasse bekomme ich vom debugger eine fehlermeldung: contextswitchdeadlock.

es ist eig ne stinknormale sache... ich hab das zweite fenster auch zur sicherheit im designer entworfen. das selbe ergebnis.

hat einer von euch schon mal etwas ähnliches gehabt?

Rufst du das Event aus einem Thread heraus auf? Dann musst du Invoke auf den GUI Thread aufrufen.

Außerdem hast du einen DeadLock verursacht. - Dieser hängt jedoch nicht mit der Form selbst zusammen.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

also einen thread habe ich dafür nicht erstellt.

lediglich eine normale winapplication.

im konstruktor gleich das ereignis angemeldet..

wie sieht in so einem fall der einsatz von invoke aus?

wie wärs mit ein wenig code?

Am besten wäre etwas code an der Stelle wo du das Form öffnest. - Und auch wo du das Event auslöst.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

public Form1()
        {
            InitializeComponent();
            wnd = new System.Windows.Forms.Form();
            wnd = null;

            //create an instance of the CoClass for the IArchiveNotification interface
            archiveNotification = new ArchiveNotification();

            //register some events for the ArchiveNotification           
            archiveNotification.ItemNewEvent+=new ArchiveNotification.ItemEventHandler(archiveNotification_ItemNewEvent);            
//anmeldung und der ganze rest...

}

private void archiveNotification_ItemNewEvent(object sender, ItemNotificationArgs e)
        {
            
            Notify n = new Notify();          
            n.Show();
//hier ist nur ein blankes fenster...            
          
        }

Und wie sieht dein Code aus, wo du ArchiveNotification.ItemEventHandler auslöst?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

public delegate void ItemEventHandler(object sender, ItemNotificationArgs e);

public event ItemEventHandler ItemNewEvent;

public virtual void OnNewItems(Archive pArchiveSource, IArchiveNotifyItems pItems)
        {
            doItemNotificationEvent(ItemNotificationType.New, pArchiveSource, pItems);

            if (ItemNewEvent != null)
            {
                ItemNewEvent(this, new ItemNotificationArgs(ItemNotificationType.Deleted, pItems, pArchiveSource));
            }
        }

Gehen wir noch einen Schritt weiter: der Aufruf von OnNewItems.

// Ziel ist es die Fehlerursache zu finden, in deinem gezeigten Code kann es nicht sein. Du führst irgendwo ein lock() aus.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

ein lock() führe ich nirgends durch...

hab mein gesamten quelltext durchsucht

es kann sein, dass der lock in der dll irgendwo durchgeführt wird, auf die ich zugreife....

Da kommen wir dem ganzen doch näher. Was ist das für eine Assembly?

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

  
                ItemNewEvent(this, new ItemNotificationArgs(ItemNotificationType.Deleted, pItems, pArchiveSource));  

Dassis doch eigenartig: Du erstellst ein neues Dingsbums, aber notifizieren tust du ItemNotificationType.Deleted, was immer das alles bedeuten mag.

Der Code scheint mir insgesamt unnötig verworren:
einerseits hat archiveNotification ein ItemNewEvent, andererseits gibts da noch ein ItemNewEvent, da weiß ich aber nicht, in welcher Klasse das steht - in Form1 oder in ArchiveNotification

Der frühe Apfel fängt den Wurm.

also...

ItemNotificationType.Deleted

hab das hier geändert.. habs wohl übersehen.
daran lag es aber nicht.

ich habe aber jetzt statt .show()
.showDialog() ausprobiert.

damit scheint es zu funktionieren....

aber warum ist das so???

denke mal weil schowdialog() die form modal aufruft, d.h. erst nach bestätigung des dialogs gehts mit dem nachfolgenden code weiter...

Wenn es mit showDIalog() funktioniert liegt der Fehler (aller wahrscheinlichkeit nach) nicht vor oder bei dem Aufruf der zweiten Form, sondern irgendwo danach.

Wie DickesB schon sagte verhindert showDialog das der dahinterliegende Code ausgeführt wird, bis das erstellte Form wieder geschlossen wird. Bei show() hingegen gehts einfach weiter.

Also wäre mal interessant zu sehen was nach dem Aufruf der zweiten Form kommt.

nun ja...

nach dem aufruf der zweiten form kommt nichts....
bevor die form angezeigt werden sollt, werden 2 string-werte übergeben...

diese werden jedoch irgedwie nicht angezeigt...

der eventhandler ist weiterhin angemeldet... sonst nichts...

ich peil langsam nix mehr

Hallo KingPin,

wirf mal einen Blick in [FAQ] Warum blockiert mein GUI? Das sind die allgemeinen Prinzipien beschrieben, die man beachten muss.

herbivore

Diese DLL die du da einbindest, die verwendet nicht zufällig COM Objekte ?