Nur weil ich neugierig war

Alle Themen rund um die Erstellung von Programmen
Antworten
FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Nur weil ich neugierig war

Beitrag von FDominicus »

Ich arbeite immer ernsthafter mit Windev, und ich glaube ich bin inzwischen ganz passabel.
Derzeit arbeite ich an einer Anbindung für eine TSE-Stick an Software. Die Software scheint mir nützlich genug zu sein, um versuchen es anzubieten. Wenn also daran mal Interesse bestehen sollte. ... ;_)

Nun denn, während dieser Entwiicklung war es nötig die Laufwerke zu finden. Vielleicht gibt es da was eingebautes in Windev, ich bin aber über die WIN API gegangen

Das ist der code der da rauskam:

Code: Alles auswählen

FUNCTION getLogicalDrives(): array of strings
arrDrives				is array of string
FunctionReturnVal		is int					// C type:DWORD
nBufferLength			is int		= 150		// C type:DWORD
sLpBuffer				is Buffer on 150 
nCountDoubleDots is int
// Prototype of the function: DWORD WINAPI GetLogicalDriveStringsA( DWORD nBufferLength, LPSTR lpBuffer );
GetLogicalDriveStringsA	is API Description
GetLogicalDriveStringsA.NomDLL				= "kernel32.dll"
GetLogicalDriveStringsA.NomFonction			= "GetLogicalDriveStringsA"
GetLogicalDriveStringsA.Parameter[1].Type	= apiInt_4 // nBufferLength
GetLogicalDriveStringsA.Parameter[2].Type	= apiInt_4 // lpBuffer

FunctionReturnVal = GetLogicalDriveStringsA(nBufferLength, &sLpBuffer)
// dbgCheckEqual(FunctionReturnVal, Length(sLpBuffer))
// return value of this function looks like this:
// C:\<0>D:\<0>E:\<0>H:\<0>P:\<0><0><0><0><0><0><0><0>
// to split that one has to do it this way:
nCountDoubleDots = StringCount(sLpBuffer, ":")
let sToSplitAt = "\"+Charact(0)
arrDrives = StringSplit(sLpBuffer,sToSplitAt)
// now there is one element more then drives in the above case
// D:,D:,E:,H:,P:;00
// so yeah we've to cut the last element Joy of nullterminated strings in an array separated by NULL! 
arrDrives.Delete(LastElement)
dbgCheckEqual(nCountDoubleDots, arrDrives.Count)

RESULT = arrDrives



Das war "fast" Spaß. Wer wohl auf die Idee kommt eine Liste von Strings mit 0 Trenner in ein Feld zu packen wo ein 0 als Trenner funktioniert.
Sagen wir mal so - es hat gedauet.

Dann fiel mir aber auch ein, daß man .NET auch benutzen kann. Hier war am schwierigsten die Deklarationen auf die Reihe zu bekommen. Da bin ich mir immer noch nicht sicher. z.b war mache ich wenn ich einen NameSpace wie System.IO in WinDev deklarierenwill. Wie auch immer, der code für .NET sieht so aus:

Code: Alles auswählen

PROCEDURE getLogicalDrivesBDN(): array of string
arrDrivesFromDotNet is array dynamic of 0 "System.IO.DriveInfo" dynamic 
arrResult is array of string
sWithoutSlash is string 




arrDrivesFromDotNet = System.IO.DriveInfo.GetDrives()

FOR EACH di IN arrDrivesFromDotNet
	sWithoutSlash = di.get_Name()
	arrResult.Add(sWithoutSlash.NoRightCharacter("\"))
END


RETURN arrResult

Wenn das nicht schöner aukkkssieht, dann weiß ich auch nicht. Dann wurde ich neugierig und dachte mir was braucht was an Zeit?
Der Code dafür:

Code: Alles auswählen

let nRuns = 100000
let startTime = TimeSys()
FOR i = 1 TO nRuns
	arrDrivesFromDotNet =getLogicalDrivesBDN()
END
let endTime =TimeSys()
Trace("Laufzeit ...NET :" + TimeDifference(startTime,endTime))


let startTimeAPI = TimeSys()
FOR i = 1 TO nRuns
	arrRetVal = getLogicalDrives()
END
let EndTimeAPI =TimeSys()
Trace("Laufzeit ...API :" + TimeDifference(startTimeAPI,EndTimeAPI))


Ich meine die Zeiten sind schon irre, aber 100 000 durchläufe. Mein lieber Schwan

Und trotzdem
1019-14xx / 100 = 1,019 s für .NET
597- 800 / 100 = 0.6 für API.

API ist "schneller" aber man, was sind unsere Rechner heute schnell geworden

Die Bequemlichkeit und Einfachheit spricht für mich klar für .NET. Wenn's aber mal wirklich pressiert sollte man die API nicht vergessen. Die Integration in WinDev finde ich recht gelungen BTW. Die wizzards helfen ganz ungemein.

satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

Re: Nur weil ich neugierig war

Beitrag von satmax »

Es gibt fast nichts was es nicht gibt in WD. ;-)

Alle Laufwerke finden:

Code: Alles auswählen

sDrives is string  = fListDisk()
Result (auf meinem PC, Zeit praktisch nicht messbar...):

C:
D:
E:
F:
G:
H:
I:
K:
L:
M:
O:
S:
T:
U:
V:
W:

Win API habe ich auch schon verwendet (für WIBI Key). .Net lasse ich außen vor...

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Nur weil ich neugierig war

Beitrag von FDominicus »

Ich dachte mir, daß ich etwas übersehen habe, und auch die Windev braucht Laufzeitt, Mal 100 000 durchlaufen lassen ;)

Mir ist auch noch eine andere Möglichkeit eingefallen GetDrivesA , das Ding gibt ein int zurück und
jedes Bit bestimmt welches Lauffwerr da ist Bit 0 -> LW A: Bit 26 -> LW Z: Das es so eine Funktion gibt, zeigt, wie knapp Resourcen zu Beginn von Windows waren. Man überleges sich das heute einmal!

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Nur weil ich neugierig war

Beitrag von FDominicus »

Hier die laufzeiten im Vergleich:

Code: Alles auswählen


let nRuns = 100000
let startTime = TimeSys()
FOR i = 1 TO nRuns
	arrDrivesFromDotNet =getLogicalDrivesBDN()
END
let endTime =TimeSys()
Trace("Laufzeit ...NET :" + TimeDifference(startTime,endTime))


let startTimeAPI = TimeSys()
FOR i = 1 TO nRuns
	arrRetVal = getLogicalDrives()
END
let EndTimeAPI =TimeSys()
Trace("Laufzeit ...API :" + TimeDifference(startTimeAPI,EndTimeAPI))


let sTartTimeWD = TimeSys()
FOR i = 1 TO nRuns
	arrRetVal = StringSplit(fListDisk(), CR)
END
let sEndTimeWD =TimeSys()
Trace("Laufzeit ...WD :" + TimeDifference(sTartTimeWD,sEndTimeWD))

RETURN



.Net um 1150
API: um 560
WD: um 1800 !

Scheint sich so zu stabilieren

Ich weiß ist lächerlich, Währende der ganzen Lebenszeit des Programms, wird es wohl kaum 100 000 mal aufgerufen:

Aber ist es nicht interessant?

satmax
Senior Member
Beiträge: 312
Registriert: 24. September 2015, 10:05
Wohnort: Biberbach, Austria
Kontaktdaten:

Re: Nur weil ich neugierig war

Beitrag von satmax »

FDominicus hat geschrieben:
18. Oktober 2021, 04:57
Ich dachte mir, daß ich etwas übersehen habe, und auch die Windev braucht Laufzeitt, Mal 100 000 durchlaufen lassen ;)

Mir ist auch noch eine andere Möglichkeit eingefallen GetDrivesA , das Ding gibt ein int zurück und
jedes Bit bestimmt welches Lauffwerr da ist Bit 0 -> LW A: Bit 26 -> LW Z: Das es so eine Funktion gibt, zeigt, wie knapp Resourcen zu Beginn von Windows waren. Man überleges sich das heute einmal!
Mein erster PC: 640 KB Hauptspeicher, davon um die 500 KB nutzbar, aber für alle Programme... Variablennamen 8-12 Zeichen oder so..., Festplatte 10 MB bei voller Bauhöhe (5 1/4"). Und das war ein richtiger Leistungssprung nach einem C64! ;-) ;-)

FDominicus
Member
Beiträge: 65
Registriert: 9. Mai 2015, 08:19

Re: Nur weil ich neugierig war

Beitrag von FDominicus »

Jetzt muß ich grinsen.
Was war ich doch damals luxuriöser ausgestattet
Atari ST mit 1 !!! MB Haupttspeicher

1 MB!


Ich habe diesen Rechner geliebt. Wer mal Lust hat suche mal nach Signum 3

Verd.. die Atari Zeiten waren cool

Antworten