Problem mit ClearStructure()

Anfängerfragen zum Programmieren mit PureBasic.
SebastianJu2
Beiträge: 180
Registriert: 24.09.2010 10:39

Re: Problem mit ClearStructure()

Beitrag von SebastianJu2 »

Dass die Handles die von PB_Any kommen diejenigen von Windows sein könnten habe ich auch schon gedacht hab aber nichts dazu gelesen.
Ich hatte beim Gedanken an Geschwindigkeit aber eher daran gedacht dass, wie Hexor sagt, Konstanten direkt fest in den Code geschrieben werden können und nicht erst der Wert einer Variable aus einem Speicher abgerufen werden muss.

Wenn du auf PB_Any setzt nimmst du dann Integer (Warum nicht long) oder Pointer? Ist ein Pointer nicht schneller?

Bei den Handles in Strukturen verstehe ich noch nicht was du meinst. Du meinst du fasst die Handles eines Fensters bzw seiner Gadgets in einer Struktur zusammen und brauchst dann nur die Struktur global setzen oder wie? Oder hast du eine eigene Unterfunktion die alle Handlesachen erledigt und alle anderen Programmteile kommunizieren mit dieser Unterfunktion wenn sie etwas mit den Gadgets usw tun will? Dann braucht nur dieses "Steuerungssprogrammteil" die Handles wissen?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Problem mit ClearStructure()

Beitrag von ts-soft »

>> Dass die Handles die von PB_Any kommen diejenigen von Windows sein könnten habe ich auch schon gedacht hab aber nichts dazu gelesen.
Weil es auch nicht stimmt!

Alle objekte werden in einer Liste gespeichert, die SimpleList.
Diese Liste ist strukturiert. Bei IDs wird diese eingetragen,
bei #PB_Any der Pointer zum Objekt und nicht das OS-Handle,
deshalb darf die ID auch nicht so groß sein, das sie mit einem
Pointer zu verwechseln ist, aber durchaus weit grösser als 5000.

Ist das Objekt Konstant, nimmt man auch Konstanten, ist das
Objekt dynamisch, nimmt man Variablen. Ist doch ganz einfach.

Fensterobjekte sind meist Konstant, aber Dateiobjekte in einer
Procedure sind eher dynamisch, da wird die Variable ja auch
nur in der Procedure verwandt, stört also auch nicht weiter.

Geschwindigkeitsunterschiede gibt es keine!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
SebastianJu2
Beiträge: 180
Registriert: 24.09.2010 10:39

Re: Problem mit ClearStructure()

Beitrag von SebastianJu2 »

Dann hab ich das hier:
Anders ist es bei '#PB_ANY'. Der Wert, der von 'OpenWindow' zurückgegeben wird, wenn man es benutzt, ist meines Wissens¹ schon direkt das OS-Handle.
mißverstanden. Es ist ein Pointer zum Handle des OS. Macht es einen Unterschied diese Handles die wegen PB_Any Pointer sind auch mit einem * davor als Pointer erkennbar zu machen oder ist das egal?

Dem Forum fehlt ein Dankebutton... ;)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Problem mit ClearStructure()

Beitrag von STARGÅTE »

Nur wenn du zB selber mittels Strukture auf Sachen zugreifen willst.

Wenn du es nur als Wert betrachtest, reicht Integer (.i) (nicht Long).
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
SebastianJu2
Beiträge: 180
Registriert: 24.09.2010 10:39

Re: Problem mit ClearStructure()

Beitrag von SebastianJu2 »

Warum eigentlich nicht long? Laut Variablenbeschreibung unterscheidet sich bei Integers die benötigte Byteanzahl zwischen 32bit und 64bit Os. Während long immer 4 Byte braucht braucht integer im 64bit-System 8 Byte. 8Byte braucht es doch aber gar nicht oder?
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Problem mit ClearStructure()

Beitrag von ts-soft »

Beweisantritt :mrgreen:
Das OS-Handle ist der erste Member der Strukture, darum geht folgendes:

Code: Alles auswählen

EnableExplicit

Define *objekt.Integer

*objekt = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 640, 480, "test")

Debug "objektpointer: " + Str(*objekt)
Debug "OS-Handle:     " + Str(*objekt\i)
Debug "OS-Handle nochmal: " + Str(WindowID(*objekt))

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Problem mit ClearStructure()

Beitrag von ts-soft »

SebastianJu2 hat geschrieben:Warum eigentlich nicht long? Laut Variablenbeschreibung unterscheidet sich bei Integers die benötigte Byteanzahl zwischen 32bit und 64bit Os. Während long immer 4 Byte braucht braucht integer im 64bit-System 8 Byte. 8Byte braucht es doch aber gar nicht oder?
Pointer und Handles sind Integer, da sich Ihre grösse nach der Breite der Register der CPU richtet.
Das heißt: Pointer und Handles sind unter x86 4 Byte groß, aber unter x64 8 Byte groß.
Damit man den Source ohne Änderungen als 32-bit oder 64-bit Anwendung kompilieren kann,
sollte man also hierfür Integer nehmen, bzw. sollte man eigentlich überall, wenn nicht unbedingt
was anderes erforderlich ist, Integer nehmen. Nur in Strukturen wo z.B. Long (DWORD) verlangt
werden, da natürlich nicht.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: Problem mit ClearStructure()

Beitrag von NicTheQuick »

SebastianJu2 hat geschrieben:Bei den Handles in Strukturen verstehe ich noch nicht was du meinst. Du meinst du fasst die Handles eines Fensters bzw seiner Gadgets in einer Struktur zusammen und brauchst dann nur die Struktur global setzen oder wie? Oder hast du eine eigene Unterfunktion die alle Handlesachen erledigt und alle anderen Programmteile kommunizieren mit dieser Unterfunktion wenn sie etwas mit den Gadgets usw tun will? Dann braucht nur dieses "Steuerungssprogrammteil" die Handles wissen?
Genau, ich habe extra Funktionen (Methoden), die die Objekte kennen und sie manipulieren können und der Rest vom Programm arbeitet dann nur noch mit diesen abstrakten Funktionen. Schau dir dazu besser das hier an: Model View Controller.
SebastianJu2
Beiträge: 180
Registriert: 24.09.2010 10:39

Re: Problem mit ClearStructure()

Beitrag von SebastianJu2 »

@ts-soft

Gut zu wissen...

Ich hab deinen Code noch mal genommen weil ich mich fragte ob der mögliche Verzicht auf die Funktionen zur Ermittlung der Windows-handle einen Vorteil in der Geschwindigkeit bringt und hab den Code so umgebaut:

Code: Alles auswählen

EnableExplicit

Define *objekt.Integer
Define.s string
Define.i starttime,x

*objekt = OpenWindow(#PB_Any, #PB_Ignore, #PB_Ignore, 640, 480, "test")

Debug "objektpointer: " + Str(*objekt)
Debug "OS-Handle:     " + Str(*objekt\i)
starttime = ElapsedMilliseconds()
For x = 0 To 10000000
  string = Str(*objekt\i)
Next
Debug Str(ElapsedMilliseconds()-starttime) + "ms"
Debug "OS-Handle nochmal: " + Str(WindowID(*objekt))
starttime = ElapsedMilliseconds()
For x = 0 To 10000000
  string = Str(WindowID(*objekt))
Next
Debug Str(ElapsedMilliseconds()-starttime) + "ms"
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Scheinbar gibt es einen kleinen Unterschied... unter 10%. Aber immerhin ein Pluspunkt für die Verwendung von #PB_Any. :)

@Nic

Klingt interessant für neue Projekte die alten Code benutzen könnten... Muss ich mir überlegen wenn ich nicht nur ein paar Programme schreibe...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Problem mit ClearStructure()

Beitrag von ts-soft »

SebastianJu2 hat geschrieben: Scheinbar gibt es einen kleinen Unterschied... unter 10%. Aber immerhin ein Pluspunkt für die Verwendung von #PB_Any. :)
Nein, Dein Test sagt überhaupt nichts aus, weil der Debugger an ist! Speedtest mit Debugger
geben niemals korrekte Ergebnisse!

Es gibt keinen Speed-Unterschied!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten