PythonNet - EventHandler Operanttypen Fehler

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Code: Alles auswählen

ThreadPool.QueueUserWorkItem(delegate {DeviceInformationChanged?.Invoke(null, lastInfo) } );
Kann es sein, dass ich den 'NoneType' Fehler deshalb bekomme, weil das Objekt 'null' ist?
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@xXSkyWalkerXx1: Da hier keiner weiss ob und was diese Zeile mit dem ganzen Rest zu tun hat kann alles mögliche sein. Oder eben auch nicht. Was bedeutet das Argument denn wo hier null übergeben wird?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Hab die 2 Datein hier hochgeladen: https://github.com/xXSkyWalkerXx1/LibCronusMAX

Das 1. Argument in .Invoke() steht für das Objekt: https://docs.microsoft.com/de-de/dotnet ... etcore-3.1
Demnach wird kein Objekt übergeben.

Mir ist auch aufgefallen, dass der PublicKeyToken bei:

Code: Alles auswählen

# ...hier 'null' ist
self.device.IOStatusChanged += EventHandler[LibCronusMAX.IOStatus](self.ioChanged)

# ...hier ein richtigen Wert besitzt
self.device.IOStatusChanged += EventHandler[EventArgs](self.ioChanged)
Demnach scheint das 1. wohl nicht korrekt zu sein, sondern die Verwendung des 2. - nehme ich deshalb an.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@xXSkyWalkerXx1: Das ``null`` muss ja kein Problem sein wenn die Methode die mit `Invoke()` aufgerufen wird eine statische Methode ist. Da würde sich dann die Folgefrage anschliessen *ob* das denn eine statische Methode ist…
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Die 'Invoke()' Methode wird in einer nicht-statischen Methode aufgerufen.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Also halten wir Mal fest:
  • Der Python-Code ist so richtig: " self.device.IOStatusChanged += EventHandler[LibCronusMAX.IOStatus](self.ioChanged) "
  • Der Typ der Klasse des EventHandlers ist 'null': " IOStatusChanged?.Invoke(null, lastIoStatus); "
D.h. somit kann Python auch nicht den NoneType-EventHandler mit dem EventHandler delegieren. Frage bleibt: (wie) kann man das lösen? :S
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Der Typ ist nicht null. Der WERT ist null. Und wenn die ?-Syntax das gleiche ist wie bei Swift, dann ist auch ggf. schon IOStatusChanged null, denn das ist denke ich mal eine Kurzform von "mach das Invoke *NUR* wenn IOStatusChanged nicht null ist".

Ich glaube ich habe das schonmal gesagt, aber ich sags nochmal: benutz einfach C#. So cool IronPython und Co auch sind, fuer solche Probleme braucht man mehr Erfahrung in beiden Sprachen, um diese Lost-in-Translation-Momente zu loesen.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Stimmt, den Wert - meinte ich doch. ^^

Hmm, also wenn ich an die Kompatibilität mit der API, die Performance meines Algorithmus denke und weitere Vorhaben denke, wird es wohl leider darauf hinauslaufen C# bzw. C++ weiter lernen zu müssen.
Schade, kostet mich wieder viel Zeit. :D
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mit jeder Sprache wird's einfacher. Gerade C# ist ziemlich gut. C++... ist ein anderes Biest, aber ggf. ist diese managed Variante handhabbar.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Warum ist C++ ein Biest? :D
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Weil es semantisch und syntaktisch überladen ist, mit undefiniertem Verhalten durchsetzt, und darum herum ein arkanes, zersplittertes System aus Compilern und Build Systemen einem das Leben schwer macht.
xXSkyWalkerXx1
User
Beiträge: 379
Registriert: Mittwoch 27. Juni 2018, 17:39

Aber eigentlich wäre es widerrum ein Vorteil C++ weiter zu lernen - wegen Studium, oder nicht?
Und läuft dann OpenCV auch viel schneller?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Keine Ahnung, was du studieren willst, oder ob die da C++ benutzen. Und solange du keinen Pixel-Level Code in Python schreibst, wuerde ich auch nicht besonders viel Performancegewinn erwarten. Du stoepselst mit Python ja nur in C++ geschriebene Algorithmen zusammen, da geht nicht so viel verloren.

Lern wegen mir C++ wenn du magst, eine relevante Sprache ist das. Es ist halt nur eine sauschwere Sprache. Und ich kenne diverse Leute, die ihr den Ruecken gekehrt haben, um eben mit C# oder Rust oder aehnlichem gluecklicher zu werden.
Antworten