1. Dashboard
  2. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team
    4. Mitgliedersuche
  3. Forenregeln
  4. Forum
    1. Unerledigte Themen
  • Anmelden
  • Registrieren
  • Suche
Alles
  • Alles
  • Artikel
  • Seiten
  • Forum
  • Erweiterte Suche
  1. AutoIt.de - Das deutschsprachige Forum.
  2. Mitglieder
  3. Andy

Beiträge von Andy

  • Zugriff auf Zeichen im String

    • Andy
    • 27. November 2013 um 19:14

    Hi,
    was hat denn ein StringToASCIIArray in einem Script zur Bearbeitung von Bitmaps zu suchen?
    Die Bitmap-Daten liegen bereits in einem Array, nämlich nacheinander im Speicher, zu adressieren über ihre Adresse oder x- und y-Koordinaten!
    Du liest also ein Array in ein anderes Array ein, läufst dann durch den Code um schlussendlich das Array wieder in ein Array zu schreiben?! Und eröffnest Threads mit dem Hinweis auf C++ und dessen "Geschwindigkeit?!

    Zitat

    So wie bei C++ : string[x].


    Mit Verlaub, programmiertechnisch hochgradigiger Dünnsch****. :thumbdown:
    Mittlerweile ist mir klar, wieso Software immer langsamer wird, wenn man mit der Aussage konfrontiert wird "muss schnell sein, ist doch in C++ geschrieben!"

    Wie schon von AspirinJunkie in Post 7 vorgeschlagen, lies die Bitmap in eine Struct ein, bearbeite dort deine "Pixel" bzw. Bereiche je nach Gusto, und wenn DANN Geschwindigkeit fehlt, schreibt man ggf eine Funktion in einigen Zeilen C als Dll, und ruft diese von AutoIt mit der Startadresse der Struct als Parameter auf.
    Beispiele für Bitmap-Be- und Verarbeitung gibt es reichlich hier im Forum, fast die Hälfte aller ASM-Scripte befassen sich mit Bitmaps, u.a. deswegen, weil deren Struktur so einfach ist.

  • Happy Birthday Raupi

    • Andy
    • 26. November 2013 um 20:59

    GUUUUDE!!!

    Und Glücklichen Herzwunsch und alles Gute! :thumbup:
    Hau rein und lass es krachen!

    Fer Frangforder gibts nur eens vun denne Geburdsdachslieder...des do!

  • Tastatureingaben in CUI?

    • Andy
    • 25. November 2013 um 22:01
    Zitat

    Ja, die Foren Suche ist suboptimal, lieber direkt Google benutzen


    mit
    site:autoit.de suchbegriff(e)
    bekommt man auch nur die Treffer aus AutoIt.de 8o

  • PrimzahlenTest

    • Andy
    • 25. November 2013 um 19:39

    Hi,
    zunächst: ich war total stolz den o.a. Code in VC++ mit kleinen Änderungen zum Laufen (und compiliert) bekommen zu haben^^

    Was soll man sagen...C halt...der Code ist 4x langsamer als mein unoptimiertes Assemblerstück, dass sogar noch sämtliche Primzahlen in eine Datei schreibt...

    Spoiler anzeigen
    [autoit]

    ;Liste der Primzahlen bis $maximum
    ;32-Bit Bytecode by Andy, eine der ersten Versionen, daher unoptimiert und "langsam"

    [/autoit] [autoit][/autoit] [autoit]

    Local $maximum = 1299709 ;Obergrenze der Primzahlen
    Local $file = "Prim_" & $maximum & ".au3" ;Datei, in welche die Primzahlen geschrieben werden

    [/autoit] [autoit][/autoit] [autoit]

    $t = TimerInit() ;Timestamp sichern
    $tStruct = DllStructCreate("uint Limit;uint Limes;char Mem[" & $maximum + 10 & "]") ;char, dann kann man nachher schön mit den stringfunktionen suchen
    ;die folgenden 4 Zeilen sparen einige Zeilen Assemblercode, außerdem kann man sich den Speicherinhalt in AutoIt anschauen
    DllStructSetData($tStruct, "Mem", "001") ;die ersten 3 Zahlen setzen, 0=0 1=0 2=1 , 2 ist die erste Primzahl
    DllStructSetData($tStruct, "Limit", $maximum);limit in die Struct schreiben
    DllStructSetData($tStruct, "Limes", Floor(Sqrt($maximum)) + 1);wurzel aus limit in die struct schreiben
    $bytecode = "0x558B6C24088B5D00B803000000C74405083130313083C00439D876F189EF83C70889FE8B4D00BB0300000089D8F7E0C604063001D839C87CF683C3023B5D007737803C1E3175F2535189D8BB0A00000031C931D2F7F3665280C10109C075F366580C30AAE2F9C6070D83C701595B3B5D047CB83B5D007CC1C607005DC3"
    $tCodeBuffer = DllStructCreate("byte[" & StringLen($bytecode) / 2 & "]") ;Speicher für den bytecode reservieren...
    DllStructSetData($tCodeBuffer, 1, $bytecode);...und mit dem Bytecode beschreiben
    ;die folgende Zeile startet den bytecode im Speicher und kehrt danach hierher zurück
    $t = TimerInit() ;Timestamp sichern
    $a = DllCall("user32.dll", "int", "CallWindowProcW", "ptr", DllStructGetPtr($tCodeBuffer), "ptr", DllStructGetPtr($tStruct), "int", 0, "int", 0, "int", 0);bytecode aufrufen, rückgabe in a[0]

    [/autoit] [autoit][/autoit] [autoit]

    $primzahlen = "2" & @CR & "3" & @CR & DllStructGetData($tStruct, "Mem");2 und 3 sind die ersten Primzahlen, dann folgt der Rest
    $m = TimerDiff($t) ;Zeit seit Programmstart

    [/autoit] [autoit][/autoit] [autoit]

    FileDelete($file) ;Primzahldatei löschen
    FileWrite($file, $primzahlen) ;Ausgabe der Primzahlen in Datei
    $m1 = TimerDiff($t);Zeit seit Programmstart incl Datei schreiben

    [/autoit] [autoit][/autoit] [autoit]

    StringReplace($primzahlen, @CR, @CR, 0, 1) ;alle CR im String zählen.....auch AutoIt hat SPEEEEED^^
    $anzahlprim = @extended ;hätte man auch vom Assembler zurückgeben lassen können^^

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(262144, "Primzahlen bis " & $maximum, $anzahlprim & " Primzahlen ermittelt in " & Int($m) & " Millisekunden" & @CRLF & _
    "Primzahlen ermitteln und in Datei schreiben in " & Int($m1) & " Millisekunden." & @CRLF & _
    "Ausgabe der Zahlen folgt in die Datei " & $file & @CRLF & _
    "Die Primzahldatei wird nun angezeigt...")
    ShellExecute($file) ;in Scite anzeigen

    [/autoit]


    Mit einem (so wie hier beschrieben) modifizierten Sieb ist nochmal Faktor 3-4 in der Geschwindigkeit drin...

    Btw. früher gab es mal den µ-It (auch als light-Version) hier im Forum, um Primzahlen und Scripte ging es im angehängten Link, viel wichtiger sind die vorgestellten Algorithmen, die entsprechend umgesetzt Welten schneller in einer Compilersprache laufen http://www.autoit.de/index.php?page=Thread&postID=141580#post141580

  • UEZ hat seinen 5. Foren Geburtstag.

    • Andy
    • 25. November 2013 um 19:16

    Glücklichen Herzwunsch und weiterhin alles Gute, lieber Freund!!!
    5 Jahre sind in der EDV-Geschichte eine Ewigkeit, ich hoffe, dass du uns weiterhin mit deinen schönen Scripten zeigst, wie man AutoIt "richtig" nutzt :thumbup:

  • Zugriff auf Zeichen im String

    • Andy
    • 25. November 2013 um 19:12
    Zitat

    Wenn ich z.B. eine Bitmap-Datei, die aus 20 MByte besteht, bearbeiten möchte und dort Millionen von Zeichen austausche will, dann dauert das ewig.

    Sagt wer?
    Na dann zeig mal dein Script, was so "ewig" dauert...
    Guckst du:

    Spoiler anzeigen
    [autoit]

    $a = ""
    for $i = 32 to 132 ;100 Byte "Paket" erstellen, "Fixed Length Block"
    $a &= Chr($i)
    next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    for $i = 1 to 18 ;bissl spielen von 10-20
    $a &= $a
    next

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(Int(StringLen($a) / 1e6) & "MB" & @crlf)

    [/autoit] [autoit][/autoit] [autoit]

    $t=timerinit()
    $b=stringreplace($a,"ABC","XXX",0,1)
    $anz=@extended
    consolewrite("Innerhalb von " & stringformat("%.3f",timerdiff($t)/1000) & "Sekunden wurden in "&stringlen($a)& " Bytes genau " & $anz &" Ersetzungen durchgeführt." & @crlf)

    [/autoit]


    tauscht auf meinem langsamen Gurkenrechner in 180ms innerhalb von 26MB genau 262144x ABC in XXX, also genau das, was ein "Pixelumschreiber" für RGB-Daten auch machen würde.
    Also 1,3MB Daten tauschen pro Sekunde...dauert ewig?!

  • Kleinster HD-Kurzfilm

    • Andy
    • 24. November 2013 um 19:04
    Zitat von xorinator

    Mir erscheint das ganze aber dennoch ein bisschen lang, kann man das nicht weiter optimieren

    Sicherlich^^
    Ich habe einfach mal angefangen um zu sehen, wie man so etwas aufbauen kann.
    Die Funktion ohne Kommentare hat als Sourcecode ca. 1000 Byte (lange Variablennamen^^ ), wer Lust hat, kann diese ja mal in C oder einer anderen Kompilersprache eintippern und als dll kompilieren
    Ich wette, mit 200-300 Bytes (!) kommt man da locker hin....
    Im Vergleich zum "gemalten" Bild von 300x400Pixeln a 4 Byte/Pixel = 480Kb, welches selbst wenn es komprimiert wird vielleicht 80Kb groß wird, ist das ziemlich "optimiert" :D

    Zitat

    ]Mir erscheint das ganze aber dennoch ein bisschen lang


    Genausogut hätte man eine Funktion 4. Ordnung durch 4 Punkte erstellen können.
    Das mache ich auch noch, zum Vergleich^^

    Jede Kurve kann man als Funktion darstellen, die Frage ist, wieviel Aufwand man betreiben will.
    Bei diesen einfachen Sachen ist es relativ simpel, aber sobald es aufwendiger wird und höhere Mathematik ins Spiel kommt, streiche ich die Segel. Dafür brauche ich viel zu viel Zeit und stecke auch nicht mehr so tief in der Materie. :huh:

  • Kleinster HD-Kurzfilm

    • Andy
    • 24. November 2013 um 18:42

    Naja, ich habe das jetzt einfach mal "prozedural" benannt...
    Natürlich ist jede Funktion in irgendeiner Art und Weise eine Prozedur, aber darauf kommt es mir nicht an.

    Siehe div. meiner Posts hier im Thread, da geht es nicht darum, per "GDI(+)" und dem gesamten dahinterstehenden Apparat ein Bild aus div. Funktionen zusammenzustellen, sondern eine Funktion zu erstellen, die auf jedem (!) Rechner das Bild als Ergebnis dieser Funktion erhält.
    So wird beim "Tropfen" zwar auch GDI+ benutzt, aber nur, weil sich das Beispiel aus der Hilfe für die _GDIPlus_GraphicsDrawLine()-Funktion so schön angeboten hatte das Ergebnis darzustellen.
    Auf einem 30 Jahre alten DOS-Rechner würde die Funktion genauso einen Tropfen darstellen können, unter DOS gab es schon Grafik^^
    In der allergrössten Not könnte man die "Pixel" auch als farbige "#" in eine HTML-Datei schreiben und so im Browser den Tropfen darstellen.

    Letztendlich geht es darum, mit mathematischen Funktionen ein "Bild" zu berechnen, und nicht, eins zu "malen". Ich verweise da nochmal auf die Seite von Iñigo Quílez
    http://www.iquilezles.org/ Bereich Strawberry ,
    z.B. http://www.iquilezles.org/www/articles/m…e/morenoise.htm
    Genaugenommen bräuchte man für das "Malen" des Bildes nur die SetPixel()-Funktion, um mittels einer einfachen Formel ein komplexes Bild zu erstellen.

  • Kleinster HD-Kurzfilm

    • Andy
    • 24. November 2013 um 17:29

    Hi,
    auf Anfrage eines einzelnen Herrn heute Nacht in der SB hole ich mal diesen Thread aus dem Keller.

    UEZ fragte an, ob man nicht eine tropfenförmige Grafik "prozedural" erzeugen könne (so habe ich es jedenfalls verstanden^^ )
    http://www.google.com/mapfiles/markerA.png

    Daraufhin habe ich folgende Idee gehabt. Ich habe nur den "rechten" Teil des Tropfens betrachtet.
    Der obere Teil ist klar, besteht aus einem Viertelkreis mit Mittelpunkt M1.
    Beim unteren Teil geht der Viertelkreis um einen bestimmten Winkel weiter bis zum Punkt S.
    Stellt man sich jetzt vor, an diesem Punkt S würden sich 2 Kreise schneiden, und der 2. Kreis hätte genau den Radius, dass er
    - den 1. Kreis im Punkt S berührt
    - die y-Achse in einem Punkt berührt
    dann wäre die Fläche zwischen dem 2.Kreis und der y-Achse genau das Stück, was unten zum Tropfen fehlt.
    Man sucht also den Radius von Kreis 2!

    Mathematisch habe ich mir einen abgebrochen^^
    Kreisformel: x²+y²=r²
    Weiterhin gilt, dass der Mittelpunkt von Kreis2 auf der Geraden von Mittelpunkt1 und S liegt.
    Mit den bekannten Radius Kreis1 (r1) und Winkel Kreis1(alpha) erstellt man 2 Gleichungen um den gesuchten Radius2 (r2) zu finden :
    (r1+r2)²=r2²+(r1+t)²
    t ist dabei eine Hilfsvariable und ist die senkrechte Länge zwischen dem Schnittpunkt der beiden Kreise S und der waagrechten durch dem Mittelpunkt von Kreis2.
    t=sin(alpha)*r2
    Weiterhin habe ich noch die "Stichhöhe" h berechnet, das ist das "fehlende" Stück unten von Kreis1
    h=2*r1*sin²(alpha/2)

    Gleichungen ineinander einsetzen und r2 ausklammern führt zu einer quadratischen Gleichung, Lösung nach siehe die allseits bekannte pq-Formel.
    Da das Ergebnis immer positiv sein muss, bleibt von den beiden Ergebnissen der pq-Formel nur eins: r2, der Radius des 2. Kreises.
    Mit bissl Dreiecksgedöns ergibt sich der Mittelpunkt M2 aus M1
    Man muss nun nur noch die beiden Flächen einfärben, fertig ist der "halbe" Tropfen.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $hGUI, $hGraphic

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    ; Create GUI
    $hGUI = GUICreate("Tropfen", 500, 600)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    ;Mittelpunkt
    $M1_x = 200
    $M1_y = 200
    $r1 = 100 ;radius
    $alpha = 35 ;winkel zur x-achse
    $farbe = 0xFF00FF00 ;grün

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $pi = ATan(1) * 4
    $degToRad = $pi / 180
    $alpha = $alpha * $degToRad
    ;stichhöhe bogen
    $h = 2 * $r1 * (Sin(($pi / 2 - $alpha) / 2) ^ 2)

    [/autoit] [autoit][/autoit] [autoit]

    ;Lösungen p+q aus quadratischer Gleichung Berührung v. 2 Kreisen ergibt r2
    $p = -2 / Sin($alpha) * ($h - $r1 + $r1 / Sin($alpha))
    $q = ($h * $h - 2 * $r1 * $h) / (Sin($alpha) ^ 2)

    [/autoit] [autoit][/autoit] [autoit]

    ;Radius 2. Kreis aus p+q
    $r2 = -$p / 2 + Sqrt(($p * $p / 4) - $q)

    [/autoit] [autoit][/autoit] [autoit]

    ;länge schnittpunkt bis Mittelpunkt 2.Kreis
    $t = $r2 * Sin($alpha)

    [/autoit] [autoit][/autoit] [autoit]

    ;Mittelpunkt 2. Kreis
    $M2_x = $M1_x + $r2
    $M2_y = $M1_y + $t + $r1 - $h

    [/autoit] [autoit][/autoit] [autoit]

    ;schnittpunkt als y-koordinate im einheitskreis
    $sy = -$r1 + $h

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hpen1 = _GDIPlus_PenCreate(0xFF00FF00)
    $hpen2 = _GDIPlus_PenCreate(0xFF0000FF)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    ;oberes segment
    for $y = $r1 to $sy step -1
    $x = Sqrt(($r1 * $r1) - ($y * $y))
    _GDIPlus_GraphicsDrawLine($hGraphics, $M1_x, $M1_y - $y, $M1_x + $x, $M1_y - $y, $hpen1)
    next

    [/autoit] [autoit][/autoit] [autoit]

    ;unteres Segment
    for $y = 0 to $t
    $x = Sqrt(($r2 * $r2) - ($y * $y))
    _GDIPlus_GraphicsDrawLine($hGraphics, $M1_x, $M2_y - $y, $M2_x - $x, $M2_y - $y, $hpen2)
    next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit]

    ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit]

    ;==>_Main

    [/autoit]

    Um einen "ganzen" Tropfen zu bekommen, muss man einfach nur die die Koordinaten der Kontur rechts nach links übertragen.
    Funktion Tropfen(Mx,My,r1,alpha,farbe) zeichnet nun den kompletten Tropfen in einer Farbe.

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Local $hGUI, $hGraphic

    [/autoit] [autoit][/autoit] [autoit]

    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    ; Create GUI
    $hGUI = GUICreate("Tropfen", 500, 600)
    $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
    GUISetState()

    [/autoit] [autoit][/autoit] [autoit]

    $M1_x = 200 ;Mittelpunkt
    $M1_y = 200
    $r1 = 100 ;Radius
    $alpha = 30 ;Winkel zur x-achse
    $farbe = 0xFFFF0000 ;rot

    [/autoit] [autoit][/autoit] [autoit]

    _Tropfen($hGraphics, $M1_x, $M1_y, $r1, $alpha, $farbe)

    [/autoit] [autoit][/autoit] [autoit]

    Do
    Until GUIGetMsg() = $GUI_EVENT_CLOSE

    [/autoit] [autoit][/autoit] [autoit]

    ; Clean up resources
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _Tropfen($hGraphics, $M1_x, $M1_y, $r1, $alpha, $farbe);mittelpunkt 1. Kreis, Radius 1. kreis, Winkel zur x-Achse

    [/autoit] [autoit][/autoit] [autoit]

    if $alpha < 15 or $alpha > 85 then return
    if $r1 < 10 or $r1 > 1000 then Return

    [/autoit] [autoit][/autoit] [autoit]

    $pi = ATan(1) * 4
    $degToRad = $pi / 180
    $alpha = $alpha * $degToRad

    [/autoit] [autoit][/autoit] [autoit]

    ;stichhöhe bogen
    $h = 2 * $r1 * (Sin(($pi / 2 - $alpha) / 2) ^ 2)

    [/autoit] [autoit][/autoit] [autoit]

    ;Lösungen p+q aus quadratischer Gleichung Berührung v. 2 Kreisen ergibt r2
    $p = -2 / Sin($alpha) * ($h - $r1 + $r1 / Sin($alpha))
    $q = ($h * $h - 2 * $r1 * $h) / (Sin($alpha) ^ 2)

    [/autoit] [autoit][/autoit] [autoit]

    ;Radius 2. Kreis aus p+q
    $r2 = -$p / 2 + Sqrt(($p * $p / 4) - $q)

    [/autoit] [autoit][/autoit] [autoit]

    ;länge schnittpunkt bis Mittelpunkt 2.Kreis
    $t = $r2 * Sin($alpha)

    [/autoit] [autoit][/autoit] [autoit]

    ;Mittelpunkt 2. Kreis
    $M2_x = $M1_x + $r2
    $M2_y = $M1_y + $t + $r1 - $h

    [/autoit] [autoit][/autoit] [autoit]

    ;schnittpunkt als y-koordinate im einheitskreis
    $sy = -$r1 + $h

    [/autoit] [autoit][/autoit] [autoit]

    $hpen = _GDIPlus_PenCreate($farbe)

    [/autoit] [autoit][/autoit] [autoit]

    ;oberes segment
    for $y = $r1 to $sy step -1
    $x = Sqrt(($r1 * $r1) - ($y * $y))
    _GDIPlus_GraphicsDrawLine($hGraphics, $M1_x - $x, $M1_y - $y, $M1_x + $x, $M1_y - $y, $hpen)
    next

    [/autoit] [autoit][/autoit] [autoit]

    ;unteres Segment
    for $y = 0 to $t
    $x = Sqrt(($r2 * $r2) - ($y * $y))
    _GDIPlus_GraphicsDrawLine($hGraphics, 2 * $M1_x - ($M2_x - $x), $M2_y - $y, $M2_x - $x, $M2_y - $y, $hpen)
    next

    [/autoit] [autoit][/autoit] [autoit]

    endfunc ;==>_Tropfen

    [/autoit] [autoit][/autoit] [autoit][/autoit]
  • FileRead Buffer?

    • Andy
    • 23. November 2013 um 20:43

    Mal angenommen, du speicherst als " Fixed Length Block" (soll es lt. Beschreibung geben^^), dann hat der Block ja eine fixe Länge (man, bin ich guuut!) und ist sehr einfach und vor allem schnell auszulesen!
    Testscript:

    Spoiler anzeigen
    [autoit]

    $a = ""
    for $i = 32 to 132 ;100 Byte "Paket" erstellen, "Fixed Length Block"
    $a &= Chr($i)
    next
    MsgBox(0, "Block", $a)

    [/autoit] [autoit][/autoit] [autoit]

    for $i = 1 to 20 ;bissl spielen von 10-20
    $a &= $a
    next

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite(Int(StringLen($a) / 1e6) & "MB" & @crlf)
    FileDelete("PCAP.bin")
    FileWrite("PCAP.bin", $a)

    [/autoit] [autoit][/autoit] [autoit]

    ;sodele, einlesen......
    $t = TimerInit()
    $file = FileOpen("PCAP.bin", 0) ;binär ist ca. 3x schneller als text!!
    $inhalt = FileRead($file)
    ;$inhalt = string($inhalt) ;umformen zum string dauert wieder^^
    FileClose($file)
    $einlesen = TimerDiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $einlesen = ' & $einlesen & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $MB_pro_sekunde = Int(StringLen($a) / 1e3 / $einlesen)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $MB_pro_sekunde = ' & $MB_pro_sekunde & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $inhalt = ' & StringLeft($inhalt, 200) & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit] [autoit][/autoit] [autoit]

    ;splitten
    $t = TimerInit()
    $Bloecke = 0
    For $i = 1 to StringLen($inhalt) step 101 ;blocklänge+1
    $Block = StringMid($inhalt, $i, 200)
    ; ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Block = ' & $Block & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $Bloecke += 1
    ; ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $bloecke = ' & $bloecke & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ; if $i < 1000 then ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $Block = ' & $Block & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    next
    $splitten = TimerDiff($t)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $splitten = ' & $splitten & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    $MB_pro_sekunde = Int(StringLen($a) / 1e3 / $splitten)
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $MB_pro_sekunde = ' & $MB_pro_sekunde & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $bloecke = ' & $Bloecke & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console

    [/autoit]

    und Ausgabe meines Gurkenrechners

    Spoiler anzeigen
    Zitat

    105MB
    @@ Debug(22) : $einlesen = 3889.13646846177
    >Error code: 0
    @@ Debug(24) : $MB_pro_sekunde = 27
    >Error code: 0
    @@ Debug(26) : $inhalt = !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚
    >Error code: 0
    @@ Debug(39) : $splitten = 2516.67656084782
    >Error code: 0
    @@ Debug(41) : $MB_pro_sekunde = 42
    >Error code: 0
    @@ Debug(43) : $bloecke = 1048576

    Alles anzeigen

    Ich bekomme leider bei größeren Dateien einen Memory-Allocation-Error von AutoIt. Das ist infolge des Datentyps Variant. Daher auch das 3x schnellere Einlesen beim binary-flag. allerdings dauert das Umformen zum String wieder länger, Binarymid() ist der horror!
    Größere Dateien zu erstellen ist aber kein Thema.
    Aber sei es drum, 100 MB werden trotzdem in ca. 4 Sekunden eingelesen, ca. 400x schneller als bei dir.
    Ich werde morgen mal ein Beispiel basteln für Zugriffe auf variable Blockgrößen innerhalb der in den Speicher eingelesenen Daten, da ist ja nur noch die Startadresse des nächsten Blocks interessant, also maximal 1-2 Zeilen zusätzlich. Jetzt sehe ich auch dein Problem, ich vermute, du hangelst dich innerhalb der Datei (!) von einem Block zum anderen!?

    Ich denke, man könnte auch unter AutoIt den Dateizugriff massiv beschleunigen mittels Verwendung der WINAPI-Funktionen ReadFile() usw.
    Auch müsste man nur 1x Speicher für eine Struct für die gelesenen Daten anlegen.

    //EDIT mach mal in deinem Script den Buffer auf 1024^2, also 1 MB, dann passt das ^^

  • Bildschirm aufnehmen

    • Andy
    • 23. November 2013 um 18:49

    Ja klar..."on the fly" heist natürlich, dass die "Frames" nacheinander ausgelesen und irgendwo in ein avi-Format weggeschrieben werden. Dass das ohne zusätzlichen Speicherbedarf abläuft, kann ich mir allerdings nicht vorstellen :P
    (Ob die einzelnen "Frames" als Bitmap im Speicher kopiert werden, sei mal dahingestellt. Vorstellen könnte ich es mir, ist ja schliesslich eine M$-interne Funktion :rofl: )

  • Buchmanagment

    • Andy
    • 23. November 2013 um 17:45

    Hallo Alina,

    fangen wir mal vorne an....
    Das "Grundgerüst", also die GUI zur Datenein- und ausgabe hast du schon, ggf. werden wir das noch etwas modifizieren müssen, aber dazu später^^

    Folgender Ansatz.:
    Du füllst die GUI mit "neuen" Buch-Daten, um erstmal die Datei zu erstellen.
    Der Button dazu ist "Neues Buch erfassen". Wenn man dort draufklickt, sollen sämtliche Daten aus der Eingabemaske in die Datei geschrieben werden.

    Dazu liest man sämtliche Inputfelder und Checkboxen mit

    [autoit]

    guictrlread()

    [/autoit]

    aus, fügt sie per

    [autoit]

    & "|" &

    [/autoit]

    zusammen und schreibt diesen String per

    [autoit]

    Filewrite()

    [/autoit]

    an das Ende der Datei buch_db.csv.
    Ist die Checkbox angehakt, schreibst du einfach ein x in die Datei....
    Ich würde die Control-ID´s sämtlicher Inputfelder zusammenfassen in einem Array. Warum? Weil du dann ganz einfach in einer 3-zeiligen Schleife den kompletten "Datenbankstring" aufbauen kannst.


    Ich habe jetzt dein Programm mal etwas angepasst (Koda macht das nicht "schön") und um ca. 50 Zeilen erweitert, damit du weiterspielen kannst und siehst, wie man so etwas ohne viel knowhow aufbauen kann^^
    Die Buttons, die man benutzen kann, sind grün.

    Spoiler anzeigen
    [autoit]


    #include <GUIConstantsEx.au3>

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    dim $input[30] ;maximale Anzahl Felder, das sollte reichen^^
    dim $label[30] ;sollten so viele wie input sein
    dim $Checkbox[10] ;anzahl checkboxen

    [/autoit] [autoit][/autoit] [autoit]

    global $Dateiname = "buch_db.csv"
    global $inhalt ;Dateiinhalt von $Dateiname
    global $zeile ;Zeileninhalt (Array)
    global $Buchnummer ; na was wohl, die angezeigte.....Buchnummer^^

    [/autoit] [autoit][/autoit] [autoit]

    $Form1 = GUICreate("Bookmanagment", 743, 588, 192, 124) ;Gui

    [/autoit] [autoit][/autoit] [autoit]

    ;inputs
    $input[0] = GUICtrlCreateInput("", 1, 1, 1, 1) ;Datenbank ?! ^^
    $input[1] = GUICtrlCreateInput("", 136, 145, 601, 28) ;Buchtitel
    $input[2] = GUICtrlCreateInput("", 136, 176, 601, 28) ;Autor
    $input[3] = GUICtrlCreateInput("", 136, 208, 601, 28) ;Verlag
    $input[4] = GUICtrlCreateInput("", 136, 240, 73, 28) ;Erscheinungsdatum
    $input[5] = GUICtrlCreateInput("", 466, 239, 57, 28) ;Preis
    $input[6] = GUICtrlCreateInput("", 136, 272, 113, 28) ;ISBN10
    $input[7] = GUICtrlCreateInput("", 320, 272, 113, 28) ;ISBN13
    $input[8] = GUICtrlCreateInput("", 629, 239, 108, 28) ;Einband
    $input[9] = GUICtrlCreateInput("", 525, 272, 105, 28) ;Seiten
    $input[10] = GUICtrlCreateInput("", 136, 304, 297, 21) ;verliehen an
    $input[11] = GUICtrlCreateInput("", 522, 302, 78, 28) ;verliehen am
    $input[12] = GUICtrlCreateInput("", 661, 302, 75, 28) ;verliehen bis
    $input[13] = GUICtrlCreateInput("", 136, 328, 297, 21) ;Lagerplatz
    $input[14] = GUICtrlCreateInput("", 200, 352, 537, 21) ;Schlagwörter
    $input[15] = GUICtrlCreateInput("", 200, 376, 537, 28) ;Info1
    $input[16] = GUICtrlCreateInput("", 200, 408, 537, 28) ;Info2
    $input[17] = GUICtrlCreateInput("", 200, 440, 537, 21) ;Kaufmöglichkeit
    $input[19] = GUICtrlCreateInput("", 200, 464, 49, 21) ;gelesen
    $input[20] = GUICtrlCreateInput("", 304, 464, 17, 28) ;sterne

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;labels
    $label[0] = GUICtrlCreateLabel("Anzahl Bücher :", 5, 15, 150, 24)
    $label[1] = GUICtrlCreateLabel("Buchtitel :", 5, 147, 62, 24)
    $label[2] = GUICtrlCreateLabel("Buchautor :", 5, 178, 71, 24)
    $label[3] = GUICtrlCreateLabel("Verlag :", 5, 210, 51, 24)
    $label[4] = GUICtrlCreateLabel("Erscheinungsdatum :", 5, 242, 129, 24)
    $label[5] = GUICtrlCreateLabel("Preis in € :", 399, 242, 68, 24)
    $label[6] = GUICtrlCreateLabel("ISBN-10 :", 5, 277, 60, 24)
    $label[8] = GUICtrlCreateLabel("ISBN-13 :", 258, 274, 60, 24)
    $label[7] = GUICtrlCreateLabel("Einband :", 569, 242, 61, 24)
    $label[9] = GUICtrlCreateLabel("Seiten :", 464, 272, 50, 24)
    $label[10] = GUICtrlCreateLabel("ausgeliehen an :", 5, 306, 103, 24)
    $label[11] = GUICtrlCreateLabel("am :", 464, 304, 30, 24)
    $label[12] = GUICtrlCreateLabel("bis :", 629, 305, 30, 24)
    $label[13] = GUICtrlCreateLabel("Lagerplatz", 5, 329, 66, 24)
    $label[14] = GUICtrlCreateLabel("Schlagwörter :", 5, 352, 89, 24)
    $label[15] = GUICtrlCreateLabel("Information - 1 :", 5, 380, 95, 24)
    $label[16] = GUICtrlCreateLabel("Information - 2 :", 5, 408, 95, 24)
    $label[17] = GUICtrlCreateLabel("Kaufmöglichkeit :", 5, 440, 106, 24)
    $label[18] = GUICtrlCreateLabel("B U C H V E R W A L T U N G ", 264, 8, 267, 27)
    $label[19] = GUICtrlCreateLabel("gelesen ?", 5, 464, 64, 24)
    $label[20] = GUICtrlCreateLabel("von 5 Sternen", 322, 466, 87, 24)
    $label[21] = GUICtrlCreateLabel("vormerken", 240, 242, 68, 24)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ;alle schriftarten setzen für inputs und label
    for $i = 0 to UBound($input) - 1 ;inputs und/oder labels
    GUICtrlSetFont($input[$i], 12, 400, 0, "Arial Narrow")
    GUICtrlSetFont($label[$i], 12, 400, 0, "Arial Narrow")
    next

    [/autoit] [autoit][/autoit] [autoit]

    $Checkbox[0] = GUICtrlCreateCheckbox("", 220, 245, 17, 17)
    GUICtrlSetFont(-1, 12, 800, 0, "Arial")
    GUICtrlSetColor(-1, 0xFF0000)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $Button1 = GUICtrlCreateButton("Buch suchen", 8, 48, 123, 25)
    $Button2 = GUICtrlCreateButton("Neues Buch erfassen", 440, 48, 115, 25)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Button3 = GUICtrlCreateButton("Sortieren nach Autor", 8, 80, 123, 25)
    $Button4 = GUICtrlCreateButton("aktuelles Buch bearbeiten", 256, 48, 179, 25)
    $Button5 = GUICtrlCreateButton("Sortieren nach Titel", 136, 80, 115, 25)
    $Button6 = GUICtrlCreateButton("sortieren nach Erscheinungsdatum", 256, 80, 179, 25)
    $Button7 = GUICtrlCreateButton("Speichern", 608, 112, 107, 25)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Button8 = GUICtrlCreateButton("vorgemerkte Bücher", 440, 80, 115, 25)
    $Button9 = GUICtrlCreateButton("Schlagwortsuche", 136, 48, 115, 25)
    $Button10 = GUICtrlCreateButton("aktuelle Buch drucken", 280, 496, 195, 25)
    $Button11 = GUICtrlCreateButton("Erste Buch", 5, 496, 101, 25)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Button12 = GUICtrlCreateButton("vorheriger Buch", 128, 496, 113, 25)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Button13 = GUICtrlCreateButton("nächster Buch", 504, 496, 113, 25)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Button14 = GUICtrlCreateButton("Letztes Buch", 640, 496, 99, 25)
    GUICtrlSetBkColor(-1, 0x00FF00)
    $Button15 = GUICtrlCreateButton("Liste alle Bücher ausgeben", 560, 48, 179, 25)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    _Einlesen_Datei() ;liest die Daten-Datei ein

    [/autoit] [autoit][/autoit] [autoit]

    ;wenn mit einem leeren Datensatz gestartet werden soll, die nächsten 2 Zeilen auskommentieren
    $Buchnummer = 1 ;erstes Buch anzeigen
    _Anzeige_Datensatz_nr($Buchnummer) ;erstes Buch anzeigen

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Button7 ;speichern
    _Speichern_in_Datei()
    case $Button2 ;Neues Buch
    _Anzeige_leeren() ;leerer Datensatz
    case $Button11 ;erstes Buch
    $Buchnummer = 1
    _Anzeige_Datensatz_nr($Buchnummer)
    case $Button12 ;vorheriges Buch
    $Buchnummer = $Buchnummer - 1
    _Anzeige_Datensatz_nr($Buchnummer)
    case $Button13 ;nächstes Buch
    $Buchnummer = $Buchnummer + 1
    _Anzeige_Datensatz_nr($Buchnummer)
    case $Button14 ;letztes Buch
    $Buchnummer = UBound($zeile) - 2
    _Anzeige_Datensatz_nr($Buchnummer)
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _Einlesen_Datei() ;liest die Daten-Datei ein
    $inhalt = FileRead($Dateiname) ;der komplette dateiinhalt
    if $inhalt = "" then $inhalt = _neue_Datei() ;wenn datei leer, dann neue Datendatei erstellen
    $zeile = StringSplit($inhalt, @crlf, 3) ;erstellt ein array aus Datenzeilen
    GUICtrlSetData($label[0], "Anzahl Bücher : " & UBound($zeile) - 2)
    endfunc ;==>_Einlesen_Datei

    [/autoit] [autoit][/autoit] [autoit]

    func _Anzeige_Datensatz_nr($nummer) ;zeigt die Daten an
    if UBound($zeile) <= 2 then return ;wenn noch kein buch eingegeben
    if $nummer < 1 then $nummer = UBound($zeile) - 2 ;wenn kleiner als erstes buch =>letztes Buch anzeigen
    if $nummer > UBound($zeile) - 2 then $nummer = 1 ;wenn grösser als letztes Buch => erstes Buch anzeigen
    $Buchnummer = $nummer
    $feld = StringSplit($zeile[$nummer], "|", 3) ;Array aus den einzelnen Feldern in der Datenzeile
    for $i = 0 to UBound($input) - 1 ;alle inputfelder füllen
    GUICtrlSetData($input[$i], $feld[$i]) ;Feldinhalt in input schreiben
    Next
    for $i = 0 to UBound($Checkbox) - 1 ;checkboxen füllen
    $status = $feld[$i + UBound($input)]
    GUICtrlSetState($Checkbox[$i], $status) ;Status der checkboxen setzen
    Next
    endfunc ;==>_Anzeige_Datensatz_nr

    [/autoit] [autoit][/autoit] [autoit]

    func _Speichern_in_Datei() ;speichert die Daten in eine Datei
    $Datensatz = "" ;
    for $i = 0 to UBound($input) - 1 ;alle Input-Felder zusammenfassen
    $Datensatz = $Datensatz & GUICtrlRead($input[$i]) & "|" ;in eine Zeile
    Next
    for $i = 0 to UBound($Checkbox) - 1 ;alle Checkbox-Felder zusammenfassen
    $Datensatz = $Datensatz & GUICtrlRead($Checkbox[$i]) & "|" ;Status der checkboxen speichern
    Next
    if StringInStr($inhalt, $Datensatz) = 0 or $inhalt = "" then ;nur wenn Datensatz noch nicht vorhanden oder datei leer
    FileWrite($Dateiname, $Datensatz & @crlf) ;Datensatzzeile in Datei schreiben
    $inhalt = $inhalt & $Datensatz ;auch in den Speicher schreiben
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $inhalt = ' & $inhalt & @crlf & '>Error code: ' & @error & @crlf) ;### Debug Console
    MsgBox(0, "Buchverwaltung", "Datensatz gespeichert!", 1)
    Else
    MsgBox(0, "Buchverwaltung", "Datensatz bereits vorhanden")
    endif
    _Einlesen_Datei() ;alle Daten auf den neuesten Stand bringen
    EndFunc ;==>_Speichern_in_Datei

    [/autoit] [autoit][/autoit] [autoit]

    func _neue_Datei() ;speichert die Daten in eine Datei
    $Datensatz = "" ;
    for $i = 0 to UBound($input) - 1 ;alle Label zusammenfassen
    $Datensatz = $Datensatz & GUICtrlRead($label[$i]) & "|" ;in eine Zeile
    Next
    for $i = 0 to UBound($Checkbox) - 1 ;alle Checkbox-Felder zusammenfassen
    $Datensatz = $Datensatz & GUICtrlRead($Checkbox[$i]) & "|" ;Status der checkboxen speichern
    Next
    FileWrite($Dateiname, $Datensatz & @crlf) ;Datensatzzeile in Datei schreiben
    _Einlesen_Datei()
    MsgBox(0, "Buchverwaltung", "Die Datei " & $Dateiname & " war nicht vorhanden oder leer!" & @crlf & "Es wurde eine neue Buchdatei unter dem Namen " & $Dateiname & " angelegt!")
    EndFunc ;==>_neue_Datei

    [/autoit] [autoit][/autoit] [autoit]

    func _Anzeige_leeren()
    for $i = 0 to UBound($input) - 1 ;alle inputfelder füllen
    GUICtrlSetData($input[$i], "") ;Feldinhalt in input schreiben
    Next
    for $i = 0 to UBound($Checkbox) - 1
    $status = $GUI_UNCHECKED
    GUICtrlSetState($Checkbox[$i], $status) ;Status der checkboxen setzen
    Next
    endfunc ;==>_Anzeige_leeren
    ;==>_Speichern_in_Datei

    [/autoit] [autoit][/autoit] [autoit][/autoit]

    //EDIT habe gerade gemerkt, das Excel die csv nicht getrennt, sondern als kompletten Text einliest, OpenOffice ist wieder mal besser und bietet beim Einlesen einen Filter an....
    Wer unter Windows die csv mit Openoffice verknüpft hat, kann mit einem einfachen

    [autoit]

    shellexecute($dateiname)

    [/autoit]

    mit OpenOffice Drucken, sortieren, Filtern uswusf :P

  • FileRead Buffer?

    • Andy
    • 23. November 2013 um 10:10

    Hi,

    Zitat

    ber ich muss natürlich auch PCAP Dateien einlesen können die z.B. von Wireshark kommen Da gibbet keine Indexdatei.

    du entäuschst mich :D

    - Wenn du eine Datei mit der Größe bspw. kleiner 100MB einlesen willst, dann liest du diese direkt ein, ab in den Speicher damit. Ob von deinem Programm oder von Wireshark erstellt spielt dabei keine Rolle.

    - Ist die Datei größer 100MB erstelle ggf vor dem Einlesen einen Index und lies daraus ein.

    Die eigentliche Analyse der Daten erfolgt sowieso zeitunkritisch! Ob da vor dem Einlesen von einer 1-Gig-Datei 5 Sekunden lang ein Index erstellt wird, mit dem du später ohne "Ruckler" durch die Daten scrollen kannst, oder ob du während der Analyse alle 100MB eine "Gedenksekunde" zum nachladen von Daten einlegen willst, ist Geschmacksache.
    Ich persönlich warte lieber beim Starten der Anwendung und habe dann einen geschmeidigen Workflow^^

  • Buchmanagment

    • Andy
    • 23. November 2013 um 09:37

    Hi,

    @alle anderen,
    Alina möchte, ausgestattet mit soliden AutoIt-Grundkenntnissen, eine einfache Buchverwaltung erstellen und (wie ich sie kenne) daran und damit arbeiten können, und nicht eine völlig neue Programmiersprache erlernen!

    Alina,
    ich fühle mit dir^^
    Generell sei gesagt, dass eine Datenbank"programmierung" nichts schlechtes ist für Leute, die sich täglich damit beschäftigen.

    Allerdings reicht für dein Vorhaben eine einfache Textdatei, CSV ist ein schönes Format, dass man mit jedem Editor oder Tabellenkalkulation bearbeiten kann, auch bspw. auf einem Linuxrechner, Mac oder sogar Smartphone...
    Wie ich dich kenne, hast du sicher schon eine Tabelle angelegt 8)

    Das Format ist supersimpel, die einzelnen "Felder" werden durch ein | getrennt.
    Buchtitel|Autor|Verlag|Erscheinungsdatum|vorgemerkt|....|||||||||||
    Das Wesen|Strobel, Arno|Fischer Verlag|20.11.2002|v|....||||||||||
    Fips und das Meer|Karl Mayer|08/15-Verlag|2.3.56|nv|....|||||||||

    Ich denke du bist in der Lage, eine so aufgebaute Textdatei zeilenweise einzulesen, die "Felder" anhand des | zu splitten und in die Maske einzutragen :thumbup:
    Bei der Eingabe von neuen Daten müssen lediglich die einzelnen Feldinhalte ausgelesen und, durch ein | getrennt, als komplette Zeile an die Datei angehängt werden.

    Ganz Fortgeschrittene lesen die Datei in ein 2-dimensionales Array ein, in dem dann bspw. einfachst gesucht und ersetzt werden kann. Dann bietet es sich an, die Inputfelder auch als Array aufzubauen.

    Vorteil ist, jedes x-beliebige Programm kann die .csv-Dateien lesen und weiterverarbeiten!

  • Bildschirm aufnehmen

    • Andy
    • 23. November 2013 um 08:04

    Hi,
    Screen-recording, das geht auch in AutoIt, sogar auf langsamen Rechnern recht flüssig. Sequenz von Screenshots speichern und diese dann nach avi umwandeln...s.UEZ´s Link.

    Damit kann man natürlich keine 5h Video aufnehmen, aber das ist ja nach der ausführlichen Beschreibung des TE, wozu man das braucht und was man damit letztendlich machen will, auch nicht erforderlich :whistling:

    Ich finde tausende von Treffern mit google nach kostenlosen Screen Recordern bzw. Video Capture, da sind die Programme fertig, bzw als DLL einzubinden.

  • FileRead Buffer?

    • Andy
    • 21. November 2013 um 19:00

    Hi,

    Zitat

    Problem ist wie gesagt, dass die Dateien im Normalfall ~10mb groß sind, eher weniger, aber es gibt ausnahmen, wo traces über mehere Tage gemacht werden, die dann auch gerne mal mehrere Gigabyte groß werden.


    Da du die PCAP-Dateien selbst schreibst, würde ich für jede dieser Dateien eine Indexdatei erstellen mit dem Muster

    Zitat

    und die jeweiligen Positionen wo welches Paket steckt


    Diese Indexdatei ist doch nur einen Bruchteil so groß wie die eigentliche PCAP-Datei!?
    Die Index-Datei kannst du auch in einem Rutsch in die Hashtable einlesen. Je nach Größe der PCAP-Datei liest du die Datei komplett in den Speicher oder mittels FileSet/Getpos direkt aus der Datei.

  • 2 kleine Fragen [Mathematik]

    • Andy
    • 20. November 2013 um 21:53

    Hi,
    die Funktion die du suchst heisst Sinus oder Cosinus.

    [autoit]

    sin()

    [/autoit]


    Anbei mal ein kleines Script, welches die von dir gewünschte "Dämpfung" simuliert

    Spoiler anzeigen
    [autoit]

    #include <GDIPlus.au3>
    #include <GUIConstantsEx.au3>
    _GDIPlus_Startup()

    [/autoit] [autoit][/autoit] [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Local $pi = 3.14159265358979
    Local $degToRad = $pi / 180 ;360° sind im Bogenmaß 2*PI

    [/autoit] [autoit][/autoit] [autoit]

    $hgui = GUICreate("Sinus-Schwingung")
    GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
    GUISetState()
    $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hgui)

    [/autoit] [autoit][/autoit] [autoit]

    $farbe = 0xFF000000 + Random(0x0000FF, 0x00FFFFFF, 1)
    $hPen = _GDIPlus_PenCreate($farbe) ;

    [/autoit] [autoit][/autoit] [autoit]

    while 1
    for $alpha = 0 to 360 step 1 ;Vollkreiswinkel
    if Int($alpha) = 90 or Int($alpha) = 270 then ;oben und unten neue Farbe erstellen
    $farbe = 0xFF000000 + Random(0x0000FF, 0x00FFFFFF, 1)
    $hPen = _GDIPlus_PenCreate($farbe);
    endif
    $y = Sin($alpha * $degToRad) ;im Bereich von -1 bis 1
    Sleep((($y * $y * 20) + 11)) ;$y*$y um vorzeichen immer positiv zu haben!
    _GDIPlus_GraphicsDrawLine($hGraphic, 10, 160 + $y * 150 + 10, 350, 160 + $y * 150 + 10, $hPen)
    Next
    wend

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    func _exit()
    Exit
    EndFunc ;==>_exit

    [/autoit]
  • FileRead Buffer?

    • Andy
    • 20. November 2013 um 20:52

    Hi,

    schau dir mal

    [autoit]

    Filegetpos()
    Filesetpos()

    [/autoit]

    an.
    Wenn du weisst wo die Daten in der Datei liegen, kannst du dir genau den Block rausholen den du brauchst, ohne die ganze Datei zu laden.
    Btw. kann man so auch Blöcke in die Datei schreiben, ohne sie vorher komplett zu öffnen (und in den Speicher zu schreiben).

    Allerdings ist JEDES Geschreibsel auf und von der Platte um Welten langsamer als das Lesen/Schreiben aus dem Speicher.
    Ich würde die 9MB komplett in den Speicher krachen und fertig^^

  • Programmier Sprache lernen

    • Andy
    • 20. November 2013 um 11:36

    Hi,
    Schnitzels Ausführungen ist nicht mehr sonderlich viel hinzuzufügen...

    @Rynow
    Du bist 27 Jahre alt, hast du dich ersthaft gefragt, was du einem Entscheider für einen Arbeitsplatz antworten willst wenn er dich fragt, was du einem andern 27-Jährigen voraus hast, der seit 12-15 Jahren intensiv PHP/Java/JS/LUA/C/C++/C#/FORTRAN/COBOL/E#/F/G#/beliebigeandereesoterischeprogrammiersprache programmiert?

    Zitat

    Hintergrund ist der, dass ich aktuell als Kaufmann tätig bin
    und sehr gerne in die Anwendungsentwicklung wechseln möchte.

    Besinne dich auf dein "Know-How" im Bezug auf deine kaufmännische Erfahrung und baue bspw. mit Hilfe von AutoIt deinen programmiertechnischen Background aus.
    Ich gehe davon aus dass du im kaufmännischen Bereich gearbeitet hast, daher kennst du den "Workflow" in DEINEM Beruf und bist damit Lichtjahre jedem noch so excellenten Programmierer voraus!
    Automatisiere Abläufe, schreibe Scripte für deine Kollegen, kontaktiere den Softwarehersteller eurer Firmensoftware und baue darüber ein "Netzwerk" für dich auf. Deine dann gewonnenen Erfahrungen und Kontakte wiegen jeden "Skill" in einer Programmiersprache auf!
    Denn eins ist klar: Ein Programmierer ist nur so gut wie die Vorgaben, die man ihm gibt...

    Es gibt reihenweise Software, die ausschliesslich von excellenten "Programmierern" erstellt wurde. Die Software an sich ist aber in der Praxis nahezu unbrauchbar, Stichworte "Klickibunti" und "featuritis".
    Die Anwender und Nutzer dieser Software und auch die Käufer großer Softwarepakete wählen IMMER diejenige Software aus, die sich in den derzeitigen Ablauf innerhalb der Firma am komfortabelsten integrieren lässt! Davon hat aber der "Programmierer" keinerlei Ahnung, er macht "das so, wie er es am besten findet". Er ist Programmierer und kein Anwender....frag mal, wieviele Programmierer 8 Stunden am Tag mit der von ihnen erstellten Software arbeiten wollten, du würdest dich wundern...

    In meinem persönlichen Umfeld habe ich in den letzten 20 Jahren die Erfahrung gemacht, dass die Softwareentwicklung gerade im Bereich der Auftragsabwicklung bzw. Ablauforganisation massiv kontraproduktiv arbeitet. Wir benötigen heute mit einer "Branchenlösung" ca. doppelt so viele Mitarbeiter in der Auftragsbearbeitung und Auftragsvorbereitung wie vor 20 Jahren, wohlgemerkt bei der selben Menge der hergestellten Produkte. Das liegt ausschliesslich am "Wokflow" innerhalb der Software! Als "Mausschubser" als Programmierer up to Date wurden, begann der Anfang vom Ende.
    Setzt man sich mit dem Softwarehersteller in Verbindung bzgl. einer Beschleunigung oder Verbesserung im Arbeitsablauf, bekommt man kurz darauf die Mitteilung "nicht möglich, da viel zu Aufwendig" oder ein Angebot mit Preisvorstellungen im Bereich von 2-3 Jahresgehältern eines Programmierers. Für einen Vorschlag, der bei einer Anwendung 14 Mausklicks einspart, bei 10 Mitarbeitern, die diesen Ablauf ca. 50-100x am Tag nur in unserer Firma durchführen. Einsparung pro MA ca 1/2h täglich! Solch einen Vorschlag bei Toyota angebracht, und man bräuchte sein Leben lang nicht mehr arbeiten gehen....
    Also mache ich das (in meiner Freizeit, bin kein Programmierer ^^ ) in AutoIt, und alle sind happy!
    Natürlich könnte ich mich hinsetzen und versuchen in C oder XYZ# programmieren, aber wozu? Viel lieber sage ich dem Programmierer, wie ich mir die programmtechnische Umsetzung der Problemlösung vorstelle. "Code kloppen" kann der dann selbst, und ich habe Aufgrund meiner Erfahrungen in AutoIt / ASM / VBA genug Background, um Hinweise bei evtl. Problemen geben zu können. Daher mache ich mir um meine berufliche Situation auch keinerlei Gedanken, der Markt für diese Tätigkeit wächst expotenziell^^, während die Gehälter der "Progerammierer" infolge Marktüberschwemmung kontinuierlich fallen.

    Lies dir vor allem die Beiträge von I2C und Marthog durch und lese zwischen den Zeilen!

  • Hash Wert von Bild erstellen

    • Andy
    • 19. November 2013 um 19:21

    Hi,
    du brauchst das Bild nicht "zuzuschneiden" wenn du es direkt mit der richtigen Größe und Position ausliest.
    Das was du per GDI bekommst ist ein sog. "Handle" also nichts weiter als eine Adresse, an deren Position die Beschreibung des Objektes, in diesem Fall ein Bild , liegt.
    Dieses Handle wird jedes Mal neu erstellt, ist also immer unterschiedlich und nicht vergleichbar! Ergo musst du die Pixeldaten hashen, die sind (hoffentlich) immer gleich.

    Zitat

    Ich habe Windows nur in der VM und nutze ein anderes OS.

    Weiss der Henker, welche Methoden in dieser VM genutzt werden, um Fenster darzustellen. Wenn nicht per GDI dann per DirectX...in dem Fall hast du gelitten. Was ich allerdings nicht verstehe, ist dass ein PRINTSCREEN funktioniert bzw. das Fenster anzeigt.
    Machst du den PRINTSCREEN innerhalb der VM oder ausserhalb?

Spenden

Jeder Euro hilft uns, Euch zu helfen.

Download

AutoIt Tutorial
AutoIt Buch
Onlinehilfe
AutoIt Entwickler
  1. Datenschutzerklärung
  2. Impressum
  3. Shoutbox-Archiv
Community-Software: WoltLab Suite™