Laden...

[gelöst] Event auslöser finden

Erstellt von dristian vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.267 Views
D
dristian Themenstarter:in
15 Beiträge seit 2007
vor 13 Jahren
[gelöst] Event auslöser finden

Guten Morgen Com,

habe momentan ein kleines aber störendes problem und langsam gehen mir die ideen aus.

Beim Starten der Applikation wird am anfang ein EventHandler aufgerufen, was eigentlich nicht sein sollte. Wenn ich versuche beim Debuggen den Fehler bzw. den Auslöser zu finden, wird der EventHandler nicht aufgerufen.

Daher wollte ich mal fragen ob ich irgendwo ermitteln kann wer, was, wann genau den EventHandler auslöst?

Ist es egal wann ich den EventHandler den Objekt zuordne? Wenn ja, kann ich ein EventHandler zu einen bestimmten Zeitpunkt auf null setzen bzw den Auslöser entfernen?

Danke schonmal für die Hilfe 😃
Gruß
Christian

K
142 Beiträge seit 2006
vor 13 Jahren

Hallo,

normalerweise steht im EventHandler das Objekt 'sender' zur Verfügung, hierdurch lassen sich Rückschlüsse auf den Auslöser des Events ziehen.

Ansonsten lässt sich da ohne weitere Infos nicht viel sagen: Windows Forms?, Programmierumgebung? EventHandler mit VisualStudio-Designer erstellt? Arbeitet da vielleicht ein Timer, wenn sich das Problem beim Debuggen anders darstellt?

Das Ereignis sollte dann abonniert werden, wenn du es benötigst 😃

Bei einem Windows-Form ist es z.B. manchmal sinnvoller Ereignisse erst im Form.Shown oder Form.Load zu abonnieren und nicht im Konstruktor.

Siehe auch [FAQ] Eigenen Event definieren / Information zu Events.

Sinnvoll bei der Fehlersuche sind auch die Klassen im System.Diagnostics-Namespace.

Grüße, Koller.

D
dristian Themenstarter:in
15 Beiträge seit 2007
vor 13 Jahren

Danke für die schnelle antwort.

Es handelt sich hierbei nicht um eine Windows-Form.

Es wird eine Connection zu einer Kamera aufgebaut. Die Connection wird asynchron aufgerufen.
Ist die Connection vorhanden, füge ich den betreffenden EventHandler dazu. Dieser EventHandler wird normalerweise nur aufgerufen wenn das Objekt bzw die Kamera ein neues Signal erhält.

Der Sender gibt mir keine gewünschten auskünfte 😛

Gruß
Christian

K
142 Beiträge seit 2006
vor 13 Jahren

Hallo,

kannst du vielleicht den relevanten Code posten? Ansonsten wird die Fehlerdiagnose schwierig, denke ich.

Grüße, Koller.

D
dristian Themenstarter:in
15 Beiträge seit 2007
vor 13 Jahren

Connection aufbauen


   private void Reconnect()
    {
        insight2 = new CvsInSight();
        insight2.StateChanged += new CvsStateChangedEventHandler(insight2_StateChanged);
        insight2.ConnectCompleted += new CvsConnectCompletedEventHandler(localInsight_ConnectCompleted);

        insight2.Connect(_ipaddress, _user, _password, true, true);
    }

Connection Completed


private void localInsight_ConnectCompleted(object sender, CvsConnectCompletedEventArgs e)
    {
     
            if (e.ErrorNumber == 0)
            {
                _isConnected = true;
            }
            else
            {
                Reconnect();
            }
 
    }

Status Connected


private void insight2_StateChanged(object sender, System.EventArgs e)
    {
        switch (insight2.State)
        {
            case CvsInSightState.Offline:
                updateStatusBar("Connected - Offline", 0);
                updateStatusBar("", 1);
                _isConnected = true;
                UpdateInSightDisplay2(insight2);
                insight2.ResultsChanged += new EventHandler(CvsInSightDisplay2_ResultsChanged);
                break;
            case CvsInSightState.Online:
                updateStatusBar("Connected - Online", 0);
                updateStatusBar("", 1);
                _isConnected = true;
                UpdateInSightDisplay2(insight2);
                insight2.ResultsChanged += new EventHandler(CvsInSightDisplay2_ResultsChanged);
                break;
            case CvsInSightState.NotConnected:
                insight2.ResultsChanged -= new EventHandler(this.CvsInSightDisplay2_ResultsChanged);
                updateStatusBar("Connecting...", 0);
                updateStatusBar("", 1);
                UpdateInSightDisplay2(insight2);
                _isConnected = false;

                Reconnect();
                break;
        }
    }

Betroffener EventHandler


 public void CvsInSightDisplay2_ResultsChanged(object sender, System.EventArgs e)
    {
        try
     {......}catch
{....}
}

Den EventHandler füge ich erst hinzu wenn der Status Connected erreicht wurde. Das heist die Verbindung steht bereits. Danach kommt eigentlich keine Aktionen mehr. Nur ruft er nach dem break im StateChanged den ResultsChanged auf.

795 Beiträge seit 2006
vor 13 Jahren

Hi.

Beim Status Offline fügst du den Eventhandler aber auch hinzu. soll das so sein?

Gruß, Christian.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
D
dristian Themenstarter:in
15 Beiträge seit 2007
vor 13 Jahren

Theoretisch sind es drei EventHandler.
ConnectCompleted: Wenn Connection fertig ist
StateChanged: Wenn sich der Status der Kamera ändert.
ResultsChanged: Wenn Kamera sich ändert

Den EventHandler ResultsChanged füge ich so spät wie möglich und das einzigstes mal an, wenn sich der Status der Kamera sich auf "Connected" ändert. Wenn sich der Status auf Disconnected ändert, entferne ich diesen.

795 Beiträge seit 2006
vor 13 Jahren

In deinem Code fügst du bei CvsInSightState.Offline auch den EventHandler CvsInSightDisplay2_ResultsChanged zu insight2.ResultsChanged hinzu. Wolltest du ihn da entfernen oder ist das so soll?

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
D
dristian Themenstarter:in
15 Beiträge seit 2007
vor 13 Jahren

Das ist gewollt. Es ist lediglich ein anderer Modus der Kamera. Er durchläuft auch nur eins der Cases

795 Beiträge seit 2006
vor 13 Jahren

Aber du fügst den Handler 2mal hinzu aber entfernst ihn nur einmal. D.h. imho, dass er einmal immernoch gebunden ist.

`There are 10 types of people in the world: Those, who think they understand the binary system Those who don't even have heard about it And those who understand "Every base is base 10"`
D
dristian Themenstarter:in
15 Beiträge seit 2007
vor 13 Jahren

Das ist richtig aber trotzdem bekommt er es nur einmal mit.

Applikation startet.
Methode Reconnect wird aufgerufen.
Connection Completed wird aufgerufen.
StateChanged wird aufgerufen mit case CvsInSightState.Online:
Anschließend, was nicht sein soll ResultChanged wird aufgerufen.

Kamera Disconnected
StateChanged wird aufgerufen mit case NotConnected
ResultsChanged wird entfernt
Kamera wird wieder connected
StateChange wird aufgerufen siehe oben

K
142 Beiträge seit 2006
vor 13 Jahren
Zufälle gibt's

Hallo,

du registrierst bei jedem Wechsel des Online-Status der Kamera den Event-Handler erneut. Das funktioniert mit Sicherheit nicht sauber. Bei dem In-Sight-Explorer gibt's doch auch Beispiel-Projekte in C#. Da wird das ResultsChanged nur einmal beim Starten der Anwendung registriert. Wenn du nicht verbunden bist, kommt das Event doch sowieso nicht, oder?

Zusätzliche In-Sight-spezifische Info:

[...]Der ResultsChanged Event ist ein sehr allgemeiner Indikator dafür, dass sich irgendetwas geändert hat. In diesem Fall kommt der Event vermutlich darum, weil das Display zwischen einer Darstellung mit und einer ohne Scrollbalken umschaltet.

Um sicher zu sein, dass ein solcher Event tatsächlich auf veränderte Ergebnisse, bedingt durch eine neue Bildaufnahme, hinweist, müssten Sie z. B. das CvsInSight.Results.Image überwachen, welches sich bei einem "gültigen" geänderten Ergebnis ändert.[...]

so der Cognex-Support im Jahre 2007 😉

Ich gehe mal nicht davon aus, dass sich in der Zwischenzeit irgendwas geändert hat. Das ResultsChanged wird also durch alles mögliche ausgelöst. Um sicherzustellen, dass wirklich ein neues Bild und Ergebnisse zur Verfügung stehen, kann man z.B. eine Count-Funktion einfügen, die die Ausführung der Zelle A0 hochzählt und überwacht.

Grüße, Koller.

D
dristian Themenstarter:in
15 Beiträge seit 2007
vor 13 Jahren

Wow ich bin begeistert!

Kannst du mir evtl. sagen in welcher Dokumentation dies stehen soll? Leider finde ich diese Aussage nicht.

Leider weiss ich auch noch nicht wie du das genau meinst. Auf welche weise kann ich die Zelle A0 überwachen bzw abfragen oder das Results.Image?

Vielen Danke
Gruß
Christian

K
142 Beiträge seit 2006
vor 13 Jahren

Hallo,

das steht in keiner Doku, sondern ist Teil einer Antwort des Cognex-Supports auf eine Anfrage meinerseits. Vermutlich hatte ich das gleiche Problem, wie du 😉

Im In-Sight-Job z.B. in Zelle B0 die Funktion "Count($A$0,9999999,0,0)" einfügen. Über

CvsInSightDisplay2.Results.Cells["B0"].Text

kannst du aus deinem C#-Projekt auf diese Zelle zugreifen. Den Wert des Zählers merkst du dir in einer Variablen und kannst so überprüfen ob tatsächlich ein Bild gemacht wurde oder sich etwas anderes geändert hat. "Results" hat auch die Eigenschaft "Image", mit der du Zugriff auf das Bild hast. Und immer alles auf !=null überprüfen, sonst knallts.

Wie gesagt, bei einer vollständigen Installation sollten auch Beispielprojekte in verschiedenen Programmiersprachen verfügbar sein. Doku gibt's im Verzeichnis "In-Sight Display Control".

Grüße, Koller.

D
dristian Themenstarter:in
15 Beiträge seit 2007
vor 13 Jahren

Klasse!

Vielen Dank, funktioniert.
*Bier ausgeb*

Ist zwar noch nicht die allerschönste Lösung aber sie funktioniert. Evtl muss ich mir nochmal Results.Image anschauen und mir nen eigenen EventHandler bauen.

Die Sample Projects konnten mir leider in diesem fall auch nicht weiterhelfen.

Gruß
Christian

W
13 Beiträge seit 2010
vor 13 Jahren

Hi Leute sitz vor nem ganz ähnlichen Problem und hoffe mir kann da jemand von euch weiterhelfen!? Ich möchte nämlich meiner Cognex Kamera ein Signal senden (von C# aus) damit mir die Kamera neue Positionsdaten zurücksendet. Bis jetzt habe ich ein Device angelegt das auch funktioniert. Meine Positionsdaten sende ich mir über WriteDevice() zu indem ich mit einem Softwarebutton (das sollte mit dem Signal von C# funktionieren) ein Event auslöse. Über Hilfe wäre ich sehr sehr dankbar!!!

W
13 Beiträge seit 2010
vor 13 Jahren

Mir wäre es aber schon eine große Hilfe wenn mir einer sagen könnte wo das "gelesene" hingeschrieben wird wenn ich mit einem ReadDevice() lese?

K
142 Beiträge seit 2006
vor 13 Jahren

Hallo,

das verstehe ich jetzt nicht so ganz: Willst du jetzt über eine TCP/IP-Verbindung mit dem InSight kommunizieren oder direkt das Objektmodell (also z.B. CvsInsight) verwenden? Ich verstehe auch nicht so ganz, wie du den Button auslöst, bzw. wofür der Button überhaupt benötigt wird.

Wie auch immer, wenn du im Spreadsheet ein ReadDevice verwendest, stehen die empfangene Daten eben in dieser Zelle als String zur Verfügung und können weiterverarbeitet werden.

Grüße, Koller.