Wie gehe ich da vor oder wo finde ich diesen????
F12 drücken.
Wie gehe ich da vor oder wo finde ich diesen????
F12 drücken.
Mit TCPConnect-Abfrage bekomme ich das nicht hin. Vermutlich weil hier das Socket abgefragt wird, das Autoit aufbaut und das erst mit TCPShutdown geschlossen wird. Egal was auf der anderen Seite passiert. Eine Abfrage funktioniert nur zuverlässig beim Start und Aufbau der Verbindung.
Du willst also den Fall simulieren wo der Server abgestürzt ist und der Client Anfragen sendet?
Wenn deine Verbindung nach dem TCPConnect abgestürzt ist (also die Verbindung etabliert werden konnte) kannst du einfach Heartbeats senden, kleine definierte Pakete auf die der Server antworten muss oder auch nicht.
Wenn du beim TCPSend ein @error bekommst ist das Senden fehlgeschlagen und die Verbindung ist vermutlich zusammengebrochen.
Ok, ich hab mich mal kurz in dein Skript eingearbeitet und habs implementiert.
Ich hätte das ganze anders strukturiert aber ich wollte das jetzt nicht komplett über den Haufen werfen, da es einfach zu viel Zeit kosten würde also hab ich das so mal beibehalten.
Idee:
Wir haben ein Buffer für das GraphicControl, ein Buffer für die History und einen für die Legs.
Wir zeichnen die History ins Historybuffer, die Legs ins Legsbuffer und anschließend zeichnen wir erst das Historybuffer und dann das Legsbuffer in das GraphicsControl Buffer.
Da wir die Bitmap nicht komplett transparent färben können (keine Ahnung ob das möglich ist) überschreiben wir beim nächsten Durchlauf die Legs mit dem Historybuffer, so wirkt es als ob wir
die alten Legs gelöscht hätten und zeichnen die neuen oben drauf.
Ist zwar ein bisschen doppelt gemoppelt aber es funkioniert, optimieren kannst du es ja noch selber.
Immerhin flackerts nicht mehr ![]()
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; ~~~~~~~~~~~~~ GDI+ Spielerei ~~~~~~~~~~~~~~~~~~~~~~~
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; AutoIt version: 3.0.103
; Language: English
; Author: "o2candoo"
; Version: 1.0
; ----------------------------------------------------------------------------
#Region Includes
#include <GUIConstantsEx.au3>
#include <ColorConstantS.au3>
#include <WindowsConstants.au3>
#include <Color.au3>
#include <GDIPlus.au3>
#include <Misc.au3>
#EndRegion
#Region HotKeys
HotKeySet("{enter}", "_Start")
#EndRegion
#Region Declarations
;~ Window
Global $wWidth = 800
Global $wHeight = 600
Global $wMitte_x = $wWidth / 2
Global $wMitte_y = $wHeight / 2
Global $mitte_x = @DesktopWidth/2
Global $mitte_y = @DesktopHeight/2
;~ Environment
Global $pi = 3.141592653589793
Global $anz = 5 ;~ Choose number between 1 and 15
;~ leg attributes
Global $fix_x = $wMitte_x
Global $fix_y = $wMitte_y
Global $l[$anz+1]
;~ leg variables
Global $x[$anz+1], $y[$anz+1], $alpha[$anz+1], $step[$anz+1]
Global $xmin, $xmax, $ymin, $ymax
$xmin = $xmax = $ymin = $ymax = 0
;~ Initialize leg Variables (Normal)
For $i = 1 To $anz
$alpha[$i] = 270
$l[$i] = Round(Random(5,300/$anz), 0)
$step[$i] = Round(Random(-20, 20), 0)
If $i = 1 Then
$x[$i] = $fix_x + ($l[1] * cos(($pi*$alpha[1])/180))
$y[$i] = $fix_y + ($l[1] * sin(($pi*$alpha[1])/180))
Else
$x[$i] = $x[$i-1] + ($l[$i] * cos(($pi*$alpha[$i])/180))
$y[$i] = $y[$i-1] + ($l[$i] * sin(($pi*$alpha[$i])/180))
EndIf
Next
;~ Initialize leg Variables (Hist)
$xHist = $x[$anz]
$yHist = $y[$anz]
;~ Process variables
$start = -1
#EndRegion
#Region Gui
$hGui = GUICreate("Form1", $wWidth, $wHeight, $mitte_x-($wWidth/2), $mitte_y-($wHeight/2),-2147483648)
GUISetBkColor($COLOR_WHITE)
Global $label[$anz+1]
$label_pos = 5
For $i = 1 To $anz
$text = String($i) & ":" & @CRLF & _
"l = " & @TAB & $l[$i] & @CRLF & _
"step = " & @TAB & $step[$i] & @CRLF
$label[$i] = GUICtrlCreateLabel($text, 10, $label_pos, 70, 50)
GUICtrlSetFont($label[$i], 7)
$label_pos += 40
Next
$b_start = GUICtrlCreateButton("START", $wWidth-70, 10, 60, 50)
GUICtrlSetFont($b_start, 12)
$b_clear = GUICtrlCreateButton("CLEAR", $wWidth-70, 65, 60, 50)
GUICtrlSetFont($b_clear, 12)
$cb_legs = GUICtrlCreateCheckbox("legs", $wWidth-50, $wHeight-80, 50, 30)
$cb_hist = GUICtrlCreateCheckbox("Hist", $wWidth-50, $wHeight-40, 50, 30)
GUICtrlSetState(-1, $GUI_CHECKED)
GUISetState(@SW_SHOW)
#EndRegion
#Region ### START GDI+ ###
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGui)
$hGraphicBitmap = _GDIPlus_BitmapCreateFromGraphics($wWidth, $wHeight, $hGraphic)
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hGraphicBitmap)
$hHistoryBitmap = _GDIPlus_BitmapCreateFromScan0($wWidth, $wHeight)
$hLegBitmap = _GDIPlus_BitmapCreateFromScan0($wWidth, $wHeight)
$hHistoryBuffer = _GDIPlus_ImageGetGraphicsContext($hHistoryBitmap)
$hLegBuffer = _GDIPlus_ImageGetGraphicsContext($hLegBitmap)
_GDIPlus_GraphicsClear($hHistoryBuffer, 0xFFFFFFFF)
_GDIPlus_GraphicsClear($hHistoryBuffer, 0xFFFFFFFF)
Global $hPen[$anz+1]
For $i = 1 To $anz
$hPen[$i] = _GDIPlus_PenCreate(0xFFFF0000, 1)
Next
$hPen_hist = _GDIPlus_PenCreate(0xFF000000, 1)
$hBrush = _GDIPlus_BrushCreateSolid (0xFFFFFFFF)
#EndRegion ### END GDI+ ###
#Region Loop
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
_Exit()
Case $b_start
_Start()
Case $b_clear
_GDIPlus_GraphicsFillRect($hGraphic, 70, 0, $wWidth-140, $wHeight, $hBrush)
_GDIPlus_GraphicsFillRect($hHistoryBuffer, 70, 0, $wWidth-140, $wHeight, $hBrush)
_GDIPlus_GraphicsFillRect($hLegBuffer, 70, 0, $wWidth-140, $wHeight, $hBrush)
EndSwitch
If $start = 1 Then
_Calc()
_Draw()
EndIf
WEnd
#EndRegion
#Region Functions
Func _Start()
$start *= -1
If $start = -1 Then
GUICtrlSetData($b_start, "START")
Else
GUICtrlSetData($b_start, "STOP")
EndIf
EndFunc
Func _Calc()
If _IsPressed("1B") Then _Exit()
;~ Hist
$xHist = $x[$anz]
$yHist = $y[$anz]
;~ Normal
For $i = 1 To $anz
$alpha[$i] += $step[$i]
If $i = 1 Then
$x[$i] = $fix_x + ($l[$i] * cos(($pi*$alpha[$i])/180))
$y[$i] = $fix_y + ($l[$i] * sin(($pi*$alpha[$i])/180))
Else
$x[$i] = $x[$i-1] + ($l[$i] * cos(($pi*$alpha[$i])/180))
$y[$i] = $y[$i-1] + ($l[$i] * sin(($pi*$alpha[$i])/180))
EndIf
If $x[$i] < $xmin Then
$xmin = $x[$i]
ElseIf $x[$i] > $xmax Then
$xmax = $x[$i]
EndIf
If $y[$i] < $ymin Then
$ymin = $y[$i]
ElseIf $y[$i] > $ymax Then
$ymax = $y[$i]
EndIf
Next
EndFunc
Func _Draw()
_GDIPlus_GraphicsDrawImageRect($hLegBuffer, $hHistoryBitmap,80, 0, $wWidth-160, $wHeight)
;~ legs
If _IsChecked($cb_legs) Then
If _IsPressed("1B") Then _Exit()
For $i = 1 To $anz
If $i = 1 Then
_GDIPlus_GraphicsDrawLine($hLegBuffer, $fix_x, $fix_y, $x[$i], $y[$i], $hPen[$i])
Else
_GDIPlus_GraphicsDrawLine($hLegBuffer, $x[$i-1], $y[$i-1], $x[$i], $y[$i], $hPen[$i])
EndIf
Next
EndIf
;~ Hist
If _IsChecked($cb_hist) Then
_GDIPlus_GraphicsDrawLine($hHistoryBuffer, $xHist, $yHist, $x[$anz], $y[$anz], $hPen_hist)
EndIf
_GDIPlus_GraphicsDrawImageRect($hBuffer, $hHistoryBitmap,80, 0, $wWidth-160, $wHeight)
_GDIPlus_GraphicsDrawImageRect($hBuffer, $hLegBitmap,80, 0, $wWidth-160, $wHeight)
_GDIPlus_GraphicsDrawImageRect($hGraphic, $hGraphicBitmap, 80, 0, $wWidth-160, $wHeight)
EndFunc
Func _IsChecked($idControlID)
Return BitAND(GUICtrlRead($idControlID), $GUI_CHECKED) = $GUI_CHECKED
EndFunc ;==>_IsChecked
Func _Exit()
For $i = 1 To $anz
_GDIPlus_PenDispose($hPen[$i])
Next
;~ _GDIPlus_GraphicsDispose($hBuffer)
;~ _GDIPlus_BitmapDispose ($hBitmap)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
Exit
EndFunc
#EndRegion
Alles anzeigen
Das ist nicht so einfach anzupassen, wenn du den Zeiger drauf haben möchtest.
Ohne Zeiger musst du einfach nur in das Buffer zeichnen und am Ende die Bitmap auf die Graphics drauf.
Jetzt hast du das Problem, dass du ja das, was du bisher gezeichnet hast, speichern willst und den Zeiger löschen möchtest.
Du könntest dazu noch einen Buffer nehmen den du nur für den Zeiger reservierst, diesen clearst du dann jedes Mal beim neu zeichnen.
So hast du dann auf der hGraphics erst das was du bisher gezeichnet hast und darüber den Zeiger.
Den Zeigerbuffer clearst du vor jedem Zeichnen, den HistoryBuffer musst du nicht clearen (du zeichnest ja von dort aus immer weiter).
AutoIt version: 3.0.103
Das ist garantiert nicht deine AutoIt-Version, eher deine SciTE-Version.
Du solltest mit einem Buffer arbeiten wenn du Legs anhast, ansonsten clearst du ständig das Graphics-Objekt und deswegen flackert das ganze.
Wenn du in einen Buffer zeichnest und am Ende das Buffer immer auf die Graphics zeichnest (ohne zu clearen) flackert es nicht.
Dass das Script schneller läuft liegt vermutlich daran, dass Mausevents an das Fenster gesendet werden und der Windows-Scheduler dem Programm mehr Zeit zuweist.
Du kannst das beheben indem du nicht so schnell wie möglich, sondern zeitlich basiert zeichnest.
Schon mal probiert GUICtrlSetData mit leerem Inhalt zu verwenden?
Das ist eigentlich ziemlich einfach, du brauchst dazu nur die Funktion Int().
Du schaust wie viele Jahre in der Zeit enthalten sind und trennst diese davon ab, mit Int() rundest du die Zahlen ab.
Hast du 1.2 Jahre, so willst du am Ende 1 Jahr, xxx Monate, ... ausgeben und nicht 2 Jahre oder 1.2 Jahre.
Du fängst von der größten Zeiteinheit an und rechnest dann immer runter, hier mal in Pseudocode
zeit = 294209907 sekunden
jahre = Int(zeit / (1jahr * 12monate * 30tage * 24stunden *60minuten *60sekunden))
zeit = zeit - jahre * (1jahr * 12monate * 30tage *24stunden *60minuten *60sekunden)
monate = Int(zeit / (1monat * 30tage *24stunden *60minuten *60sekunden))
zeit = zeit - monate * (1monat * 30tage *24stunden *60minuten *60sekunden))
tage = Int(zeit / (1tag *24stunden *60minuten *60sekunden)
zeit = zeit - tage * (1tag *24stunden *60minuten *60sekunden)
stunden = Int(zeit / (1stunde *60minuten *60sekunden)
zeit = zeit - tage * (1stunde *60minuten *60sekunden)
minuten = Int(zeit / (1minute * 60sekunden)
zeit = zeit - tage * (1minute * 60sekunden)
sekunden = zeit <-- vorausgesetzt du hast Sekunden und nicht Millisekunden
HeiWoMa: Auch eine Möglichkeit aber was wenn du (und man sollte alle Eventualitäten bedenken) sehr schlaue Schüler hast, die das raus bekommen und die host vorher sichern und in der Prüfung überschreiben? Schon ist diese "Sicherung" pfutsch.
Ohne Adminrechte kannst du die hosts nur, wenn überhaupt, lesen. Haben die Benutzerkonten der Schüler keine Adminrechte müssten sie schon eine Lücke im Windows Betriebssystem finden wenn das Adminkontopasswort grad nicht 12345 lautet.
Je nachdem wie viel Kontrolle man noch über das System hat könnte man auch einfach alle Anfragen gegen localhost laufen lassen.
Proxifier kann das z.B., aber man kann es dann natürlich in der GUI dementsprechend deaktivieren.
Mal ein ganz einfacher Vorschlag, warum haben die Schüler nicht 5 Minuten Office zu starten und sich den Rechner einzurichten und dann wird der Stecker gezogen (also vom Switch)?
Kurz noch einmal rumgehen und schauen ob irgendwo andere Dokumente offen sind und die Prüfung kann doch losgehen?
Also UBound bedeutet schon mal (wenn ich das richtig verstanden habe) das er das Array weiter führt bis der letzte wert erreicht ist richtig ?
UBound gibt dir die Größe des Arrays in der entsprechenden Dimension zurück, die du angibst.
Wenn du den Fehler bekommst heißt das, dass dein Array kein 2D Array ist bzw. die 2. Dimension kleiner als 1 ist.
Lass dir mal mit UBound($aResult, 2) in einer MsgBox oder in der Konsole die Größe davon ausgeben oder prüfe es in _ArrayDisplay händisch nach.
Ob die Date.au3 die Umwandlung unterstützt kann ich dir nicht sagen aber du kannst dich da ja mal umsehen.
Ansonsten scheint das keine komplizierte Umwandlung zu sein. Das Datum parst du mit RegEx raus und ersetzt den Monat durch die Zahl und formatierst das Datum.
Für die Uhrzeit musst du nur schauen ob da PM oder AM steht und jeweils +12 draufaddieren (aber Achtung, 12 PM = 12 Uhr Mittag, 12 AM = Mitternacht, 1 PM = 13 Uhr).
Das kommt darauf an was du für einen Wert zuweist, ob er ein Funktionsparameter ist oder eine globale Variable oder bereits eine Konstante.
Nichtsdestotrotz ist der Geschwindigkeitsunterschied vollständig zu vernachlässigen da es hier um die Zuweisung einer einzigen Variable geht.
Hab jetzt auch mal nachgeschaut, der CHIP-Installer ist brauchbar, wenn man die 2-3 nicht benötigten Programme NICHT installiert^^
Fast immer gibt es rechts von dem Button einen kleinen dickgedruckten Text "Manuelle Installation" mit dem man ohne den Installer auskommt.
Generell nutze ich chip überhaupt nicht mehr, weil mich dieses Installerzeugs einfach nur ankotzt (Adblock Werbung noch dazu) und man direkt beim Hersteller laden kann.
Aber das soll ja nicht Thema hier sein.
Ja, der Performancegewinn ist < ms, aber warum sollte ich ihn nicht mitnehmen, zudem summiert sich das ja auf? Dank Local sollte es ja nicht zu Kollisionen kommen können. Oder gehört das einfach zu good coding practices?
Not = ist auch aus irgendeinem Grund doppelt so schnell wie <>
Local Static war bei meinem Test 0.2% schneller, das istn Witz verglichen damit, was eine Funktion überhaupt rechnet.
Es geht hier nur um die Zuweisung! Du bist wesentlich besser bedient wenn du einfach deinen Code optimierst und semantisch lesbarer machst.
Du passt den Wert innerhalb der Funktion nicht an wenn du ihn einmal definiert hast, also solltest du Const nehmen und nicht Static.
Static brauchst du wenn du explizit keine globale Variable definieren möchtest und eine lokal persistente Variable haben willst, eine die ihren Inhalt nach dem Funktionsdurchlauf behält.
Das tust du aber nicht, ich sehe nirgends, dass du die Static Variable nochmal beschreibst, selbst wenn du den Inhalt von $iShortSleep anpasst wird deine Funktion ihren ursprünglichen Wert behalten (so funktionieren Static Vars).
Da sich mir der Gedanke aufgrängt, daß die Variablen (*_Loop) innerhalb einer/mehrer Funktion(en) als Endbedingung eines Loop's benutzt werden sollen, kann ich keinen Nutzen einer Local Static Deklaration erkennen.
Ja, das habe ich auch nicht gesagt. Static sollte schneller sein, da nicht jedes Mal der Wert der Variable zugewiesen wird und somit vermutlich schneller ist.
Aber dieser Geschwindigkeitsschub ist komplett vernachlässigbar.
Ich weiß nicht ob _Excel_RangeSort 2D Arrays sortieren kann aber kannst du die Daten nicht in ein Array lesen und mit _ArraySort sortieren und dann wieder in das Dokument schreiben?
Nun, es gibt bestimmt eine Möglichkeit die nicht mal ins Array zu lassen aber, da sie immer als Index 1 und 2 auftauchen kannst (einfach prüfen ob 1 = "." und 2 = ".." du sie einfach ArrayDeleten.
Dann aber nicht vergessen die Anzahl in Index 0 zu reduzieren (oder gleich mitlöschen, schließlich gibt es ja UBound).
Das sind "Standardordner" die Betriebssysteme immer anzeigen. "." ist dabei das aktuelle Verzeichnis und ".." das Verzeichnis darüber.
Der Performancegewinn ist so gut wie zu vernachlässigen da du bestimmt nicht das letzte bisschen an Geschwindigkeit rauskitzeln willst.
Du veränderst den Inhalt der Variablen nicht also kannst du Const verwenden, allerdings wirst du bei Local Const kein Static setzen können, macht ja auch sinn.
Ich würde hier die Variante nehmen die sich schöner liest. Wenn der Wert sich nicht verändert: Local Const $I_SHORT_LOOP = 3000 / $iShortSleep.
Du kannst es auch als Local Static deklarieren, und es wäre wohl "schneller", aber der Geschwindigkeitsschub ist infinitesimal klein.
If Not StringRight($read_status, 6) = "Fertig" Then
Das Not bindet stärker als der Gleichheits operator. Du negierst also erst einen String und dann prüfst du ob er = "Fertig" ist.
Wieso verwendest du nicht direkt den Ungleichoperator <> statt Not? Ansonsten musst du StringRight = Fertig in Klammern setzen wenn du Not nutzen willst.