Hardware Baukasten Tinkerforge

  • Hey Andy

    Keinesfalls darfst du Events blocken!

    Noch eine Frage.
    Warum ist das mit dem Blocken so?
    Es klappt eigentlich alles in den Events bis auf _ArrayDisplay() warum?
    Das hier bleibt hängen...

    Spoiler anzeigen
    [autoit]

    #include <array.au3>
    Global Const $FD_READ = 1
    Global Const $FD_WRITE = 2
    Global Const $FD_OOB = 4
    Global Const $FD_ACCEPT = 8
    Global Const $FD_CONNECT = 16
    Global Const $FD_CLOSE = 32
    Global $hWs2_32 = -1

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

    TCPStartup()
    $iListenSocket = TCPListen ( '127.0.0.1', 4222 )

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

    Do
    $iSocket = TCPAccept($iListenSocket)
    Until $iSocket <> -1
    TCPCloseSocket($iListenSocket)

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

    $__TCP_WINDOW = GUICreate("GUIRegisterMsg")
    $hWs2_32 = DllOpen( "Ws2_32.dll" )
    DllCall( $hWs2_32,"int", "WSAAsyncSelect", "uint", $iSocket, "hwnd", $__TCP_WINDOW, "uint", 0x0400, "int", $FD_READ )
    GUIRegisterMsg( 0x0400, "Event" )

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

    While 1
    Sleep(5)
    WEnd

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

    Func Event($hWnd, $iMsgID, $WParam, $LParam)
    $sDataBuff = TCPRecv($iSocket, 1024)
    Local $aArray_Base[2] = ["Org Item 0", "Org item 1"]
    _ArrayDisplay($aArray_Base, "1D - Base array")

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

    DllCall( $hWs2_32,"int", "WSAAsyncSelect", "uint", $iSocket, "hwnd", $__TCP_WINDOW, "uint", 0x0400, "int", $FD_READ )
    EndFunc

    [/autoit]

    Mache ich das hier bei Opt("GUIOnEventMode",1 ) klappt es ja auch...in etwa so....

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <array.au3>

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

    Opt("GUIOnEventMode", 1) ; Change to OnEvent mode

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

    Local $hMainGUI = GUICreate("Hello World", 200, 100)
    GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEButton")
    GUICtrlCreateLabel("Hello world! How are you?", 30, 10)
    Local $iOKButton = GUICtrlCreateButton("OK", 70, 50, 60)
    GUICtrlSetOnEvent($iOKButton, "OKButton")
    GUISetState(@SW_SHOW, $hMainGUI)

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

    While 1
    Sleep(100) ; Sleep to reduce CPU usage
    WEnd

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

    Func OKButton()
    ; Note: At this point @GUI_CtrlId would equal $iOKButton,
    ; and @GUI_WinHandle would equal $hMainGUI
    Local $aArray_Base[2] = ["Org Item 0", "Org item 1"]
    _ArrayDisplay($aArray_Base, "1D - Base array")
    EndFunc ;==>OKButton

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

    Func CLOSEButton()
    ; Note: At this point @GUI_CtrlId would equal $GUI_EVENT_CLOSE,
    ; and @GUI_WinHandle would equal $hMainGUI
    MsgBox(0, "GUI Event", "You selected CLOSE! Exiting...")
    Exit
    EndFunc ;==>CLOSEButton

    [/autoit]

    Gibts da irgendeine Möglichkeit?

    MFG Chris :D

  • Du arbeitest da Eine Message ab. Das System wartet darauf, dass dein Fenster das ok gibt, dass das bearbeitet wurde, bzw. dass es weitergehn soll. Kommt das nicht "hängt" sich dein fenster auf. (Es kann nicht mehr auf events reagiert werden, da schon eines bearbeitet wird. Es wird ja nicht für jedes Event ein neuer Thread in deinem Orgramm geöffnet).

  • Noch eine Frage.
    Warum ist das mit dem Blocken so?
    Es klappt eigentlich alles in den Events bis auf _ArrayDisplay() warum?


    Windows besteht eigentlich nur aus Events und Messages, für jeden Tastendruck, Mausbewegung, Fensteraktualisierung, Netzwerktätigkeit, für alles gibt es ein Event.
    Du hängst jetzt dein Event in diese Kette mit ein. Windows arbeitet nun pausenlos diese Kette ab und sobald eine Aktion registriert wird, wird sofort die entsprechende Funktion aufgerufen. Dabei ist es Windows herzlich egal, was in dieser Funktion passiert, denn die oberste Windows-Direktive lautet: "Jedes Fenster ist für seinen Inhalt selbst verantwortlich!".
    Die Funktion meldet lediglich ein "OK" beim Verlassen an den Event-Handler. Um die Systemstabilität bei nicht erfolgreich beendeten Funktionen zu gefährden, werden diese nach einer bestimmten Zeit aus der Kette "ausgehängt".
    Wenn du jetzt innerhalb der Funktion bspw. eine Messagebox oder das Arraydisplay aufrufst, bleibt der Ablauf hängen. Deine Funktion wird nicht mehr aufgerufen, da beim Beenden kein erfolgreiches "OK" registriert wurde. Für Windows ist das ein Fehler, die Funktion wird aus der Kette gelöscht! Wenn jetzt bspw. bei der Msgbox auf "Weiter" geklickt wird, passiert....nichts!
    Daher auch am Ende deiner Funktion Event() die Info FD_READ an den TCP-Handler, dass nun eine neue Nachricht empfangen werden kann!

  • Erster Post auf aktuellen Stand gebracht.

    Aktueller Stand ( 9 Beispiele :(

    TinkerForge_Bsp1_LCDHelloWorld
    TinkerForge_Bsp2_LCDProgessBar
    TinkerForge_Bsp3_FirstEvent
    TinkerForge_Bsp4_GetStackData
    TinkerForge_Bsp5_Poti
    TinkerForge_Bsp10_1_ServoBrick
    TinkerForge_Bsp10_2_ServoBrick_Event
    TinkerForge_Bsp11_1_StepperBrick
    TinkerForge_Bsp12_16IO

    Da es gerade mal ein sehr sehr kleiner Teil ist den ich übersetzen konnte ( sind jetzt schon über 3,2k Zeilen ) wäre es cool wenn jemand mit machen würde... naja...

    MFG Chris :D