Seite 2 von 3
Re: Problem mit ClearStructure()
Verfasst: 25.02.2011 14:18
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?
Re: Problem mit ClearStructure()
Verfasst: 25.02.2011 14:19
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!
Re: Problem mit ClearStructure()
Verfasst: 25.02.2011 15:09
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...

Re: Problem mit ClearStructure()
Verfasst: 25.02.2011 15:14
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).
Re: Problem mit ClearStructure()
Verfasst: 25.02.2011 15:20
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?
Re: Problem mit ClearStructure()
Verfasst: 25.02.2011 15:25
von ts-soft
Beweisantritt
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
Re: Problem mit ClearStructure()
Verfasst: 25.02.2011 15:29
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.
Re: Problem mit ClearStructure()
Verfasst: 25.02.2011 15:46
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.
Re: Problem mit ClearStructure()
Verfasst: 25.02.2011 15:57
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...
Re: Problem mit ClearStructure()
Verfasst: 25.02.2011 16:01
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!