Pointer an Thread übergeben

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.
Antworten
globalhost
User
Beiträge: 4
Registriert: Samstag 11. März 2017, 23:55

Hallo Leute,

ich versuche gerade bisschen Erfahrung in Python zu sammeln in dem ich ein kleines Projekt umsetze.
Jetzt habe ich aber ein kleines Problem, da ich gerade gelesen habe, dass es keine Pointer gibt.

Ich möchte in einem Thread überprüfen ob sich eine Variable verändert hat. Dabei war eigentlich der Plan, dass ich den Thread starte und dabei den aktuellen Wert der Variable und den Pointer zur Variable übergebe. Der Thread würde dann die Werte immer abgleichen, bis sich diese unterscheiden.
Jetzt habe ich schon hin und her überlegt, wie ich dieses Problem stattdessen lösen könnte. Eine globale Variable kommt dabei ja nicht in Betracht, da ich das ganze ja mit mehreren Variablen mache und das ganze nicht mehr rekursiv wäre.

Habt ihr eine Idee wie man das ganze lösen könnte?

Mit freundlichen Grüßen
Globelhost
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@globalhost: das hört sich komisch an. Wenn Du auf das Ändern einer Variable warten willst, dann tu das doch einfach, wenn Du die Variable änderst, und wann da das tust, weißt Du ja, da Du die Stelle selbst programmierst. Ansonsten findet die Kommunikation zwischen verschiedenen Threads über Events, Queues, etc. statt und nicht über Referenzen auf Variablen.
globalhost
User
Beiträge: 4
Registriert: Samstag 11. März 2017, 23:55

Das Problem ist, dass ich die Variable nicht selber ändere, sondern, dass diese nur ausgelesen werden.
Ich lese Werte aus einem Spiel mittels Shared Memory aus und möchte mittels eines Threads herausfinden, wann diese sich geändert hat. Da aber ich nicht jede Variable mit einer eigenen Klasse ausstatten möchte, würde ich gerne eine Klasse machen, welche von Thread abgeleitet ist. Diese vergleicht dann den vorherigen Wert mit dem aktuellen Wert.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@globalhost:
Man hat den Eindruck, dass du dich mit Threading unter Python noch nicht wirklich vertraut gemacht hast. Das ist auch ein recht komplexes Thema. Von der offiziellen Doku für's `threading`-Modul könnte man sich leicht erschlagen fühlen. Als Alternative findest du hier eine umfangreiche Einführung mit vielen Beispielen.
globalhost
User
Beiträge: 4
Registriert: Samstag 11. März 2017, 23:55

Danke für den Link. Ich möchte aber keine Kommunikation zwischen Threads sondern möchte nur auf einen Speicherbereich zugreifen. Man könnte dies auch analog auf eine Funktion übertragen.
Man stellt sich folgende Whileschleife vor:

Code: Alles auswählen

while True:
	if alterWert != neuerWert:
		--> irgendeine Handlung
Jetzt wird neuerWert aber ständig geändert, da es ja nur auf die Werte innerhalb eines Spiels zugreift.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Es gibt in Python keine Pointer und man kommt innerhalb der Sprache auch nicht direkt mit Speicheradressen in Berührung. Einige Dinge kann man mit dem `ctypes`-Modul erreichen. Das tut man aber nur in Verbindung mit C-Bibliotheken. Dir sollte jedenfalls bewusst sein, dass Python auf einem viel höheren Abstraktionsniveau angesiedelt ist im Vergleich zu Sprachen wie C oder C++. Hier gelten zum Teil völlig andere Konzepte, mit denen du dich entsprechend beschäftigen solltest. Falls du das nicht möchtest oder es dir für den Vorhaben zu umständlich erscheint, dann bist du mit der Wahl einer anderen Programmiersprache, die näher am Betriebssystem konzipiert ist, wahrscheinlich besser beraten...
globalhost
User
Beiträge: 4
Registriert: Samstag 11. März 2017, 23:55

Ok, da werde ich mich mal genauer damit beschäftigen.
Danke^^
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

globalhost hat geschrieben:Ich lese Werte aus einem Spiel mittels Shared Memory aus und möchte mittels eines Threads herausfinden, wann diese sich geändert hat.
Beitrag erst jetzt gesehen. Dann schau dir wirklich mal das ctypes-Modul an, sowie die Module struct und array.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@globalhost: wenn Du mit shared memory arbeitest, hast Du ja einen „Pointer“, nämlich den Index in dieses Shared-Memory-Array. Dabei ist letztlich egal, ob Du das in einem Thread machst, oder im Hauptprogramm, da das Spiel ein getrennter Prozess ist und Du dann Schwierigkeiten mit Interpozesskommunikation bekommen kannst, wenn der Zugriff auf den Speicherbereich nicht irgendwie synchronisiert wird.

Daher lassen wir mal die Threads beiseite, definiere uns eine Struktur index -> alterwert und greifen darüber auf eine shared-memory-Array zu:

Code: Alles auswählen

shared_memory = mmap(...)
watches = {idx: shared_memory[idx] for idx in (0, 123, 227)}
while True:
    for index, old_value in watches.items():
        new_value = shared_memory[idx]
        if new_value != old_value:
            watches[idx] = new_value
            do_something(idx, old_value, new_value)
    sleep(0.01)
Antworten