Do Sleep(100) Until $GotVariable ;<~ geht trotz False aus der Schleife

  • Es geht wieder um den Virenscanner der hash's abgleicht. :saint:

    Wie es sich für ein reifendes program gehört wird dieses mehrmalig neugeschrieben, so hörte ich das zumindestens mal.
    Daher bin ich beim 3ten Neuschreib versuch um diesmal die Exchange Variables UDF Beta umzusetzen.

    Dabei stieß ich auf das problem das eine Schleife, die nur dazu da ist damit eine antwort erwartet werden kann, ausbügst & den Wert einer Variable ignoriert. Derweil konnte ich den fehler die ganze letzte nacht nicht herausbuggen & frage deshalb hier nach meinem Logik fehler den ihr wahrscheinlich sonderbar schnell erkennt.

    Ich habe mich für folgendes Konzept entschieden. Eine Exe die als hauptkontroller agiert & sich 4 weitere male, mit ID Parameter, ausführt(wobei ich beim nächsten neuschreiben die Thread anzahl miteinbeziehe) und damit 4 Worker bekommt die auf befehle zum ausführen warten. Dabei wird zuerst abgewartet welche Worker sich zurückmelden. Als nächstes erstelt der Contoller eine Dateiliste der, bisher auf C: liegenden, Daten und teilt diese durch 4 um sie dann an die Worker zu schicken... Soweit so gut da kommt das problem. Die Worker sollen laut code auf die Dateiliste warten und dann eine rückmeldung geben. Doch die Worker springen beinahe spontan weiter und ignorieren das die Until $GotVariable FALSE ist. Doch auch eben nicht immer wie ich beobachten durfte. So wartet der eine oder andere Worker doch auch mal auf seine Liste, Meißt der erste. ?(

    Code :)

    Spoiler anzeigen
  • eine for loop die bei 1 anfängt und bei 4 aufhören soll, beginnt mit 4, darauf folgt 2, 3, 4. Ich weiß nicht was mit meinem script falsch ist.

    Die ID's von den workern sind korrekt verteilt, doch irgendwie stimmt weder die response noch wird der richtige angesprochen wenn ich es fordere.
    Wenn ich die Worker manuell anspreche reagieren sie korrekt, doch der controller bekommt das nicht *geschissen*. Obwohl die loop nur von 1-4 gehen kann. Ich verstehe nicht wie der controller die den Worker mit der ID 1 anspricht & die 4 antwortet. Oder die 1 doppelt.
    [Blockierte Grafik: https://www2.pic-upload.de/img/33462457/1.png]


    Code :)

    Spoiler anzeigen
  • Also ich hatte das bei ExchangeVariables so interpretiert das du für jede $ID dein eigenes Startup brauchen würdest.
    Im Main machst du nur ein Startup für 0, die anderen 4 Version nutzen 1 bis 4

    Bei mir laufen bis zu 10 x 2 Programme die sich so unterhalten auf einem Server (Terminalserver mit verschiedenen Benutzern),
    Die Unique-ID ist bei allen gleich,
    Also $ID nutze ich die PID von Run() bzw. ShellExecute. Da es jede PID nur einmal gibt unterhalten sich nur die richtigen Programme des jeweiligen Benutzers

    Dein Vorgehen sollte auch gehen - aber ich meine du musst es so machen:

    AutoIt
    For $i = 1 To 4 Step 1
    		ShellExecute(@ScriptFullPath, $i, @ScriptDir, '', @SW_SHOW) ;Execute dich selbst 4 mal mit Parameter 1-4
    		_ExchangeVariables_Startup($i, 'MAIN', '_VarMsg')
    	Next
  • Nachtrag: Ich habe bei mir die Abfrage der Nachrichten in eine eigene Funktion gepackt die per AdLibRegister regelmäßig aufgerufen wird.
    Und arbeite im GUIOnEvent-Modus.

    Ich kann mich irren, aber dein Hauptprogramm läuft nur so lange bis es eine Nachricht gab? Die Worker haben ja ein While 1

    ich sollte genauer lesen, es wartet bis sich jeder gemeldet hat

  • ich sollte genauer lesen, es wartet bis sich jeder gemeldet hat

    Ja korrekt doch irgendwie spricht der Controller die 1 an, bekommt aber von der 4 eine antwort.
    Dann wenn sich alle einmal melden sollen, zu beginn, kommt die 1 2x zu wort & die 4 praktisch nicht, doch irgendwie sieht man das dieser sich auch gemeldet hat, wenn man in die console des worker's schaut. Das verwundert mich sehr.

    Dahin gehend besteht mein problem das bei der For schleife die falschen angesprochen werden.
    Reihenfolgen die häufig vorkamen. 1,1,2,3 | 1,2,2,3 & das in einer schleife die von 1-4 geht.

  • hast du das mit den unterschiedlichen IDs getestet? Das die sich nicht in der richtigen Reihenfolge melden kann schon sein, die laufen halt alle 4 und quatschen durcheinander.
    Wenn das nicht hilft kannst du ja ach die Unique-ID pro Prozess einmalig machen (häng halt eine Zahl dran)

  • Hm ja ich testete es, doch es verbleibt weiterhin fehlerhaft.

    Der controller spricht jeden Worker seperat an & wartet dann auf eine Antwort um eben zu verhindern das alle durcheinander quatschen.
    Mir fällt derweil immernoch keine lösung ein, außer den Controller neuzuschreiben. Ich habe auch schon ein neues Konzept im kopf o:
    Ein Controller der überprüft welche dinge noch fehlen & diese automatisch abarbeitet, fehler behebt & was auch immer mir noch so einfällt. Das ist eine gute gelegenheit um mich besser mit switch's auseinanderzusetzen :)