Wie "ineinandergreifende" Schleifen realisieren?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Forum,

    ich habe Folgendes vor: ein Backup-Script soll automatisch Bilddateien einer SD-Karte auf einen USB-Stick kopieren. Der Verlauf der Aktion soll durch eine blinkende RGB-LED angezeigt werden. Nach jeweils 1/6 der übertragenen Daten soll sich die Farbe der blinkenden LED ändern. Mein Problem: das Blinken der LED wird über einen While-Loop realisiert, das Kopieren der Dateien über eine For-Schleife. Loop und Schleife für sich funktionieren, aber wie bringe ich beide zusammen? Wie muss der Programmablauf aussehen? Muss ich hier mit getrennten Threads arbeiten (was ich Anfänger leider noch nicht beherrsche) oder gibt es anderen Möglichkeiten, die Schleife und den Loop "gleichzeitig" zu durchlaufen? (Ihr merkt, so richtig viel Ahnung von all dem habe ich leider noch nicht) ...

  • Servus,
    ad hoc Vorschlag: setze eine Variable auf den gewünschten RGB-Wert in Deiner Kopier-Schleife und verwende diese Variable in Deiner while-loop zum Ansteuern der LED ...

    //EDIT: als Erweiterung kannst Du die Blinkfrequenz ebenfalls über eine Variable realisieren, die genauso gesetzt und ausgewertet/verarbeitet wird wie der RGB Wert. Dadurch kannst Du die LED dann auch noch schneller oder langsamer blinken lassen ;)

    cu,
    -ds-

  • Hallo Herr Kaiser,

    meiner Meinung nach liegt Dein Gedankenfehler darin, dass Du kostbare CPU-Zeit verplemperst, um die LED blinken zu lassen.

    Code
    LED AN
    warten
    LED AUS
    warten


    wiederholt sich innerhalb des Kopierens.

    Ich würde es so machen:

    • Die Dateien ermitteln und mitsamt ihrer Dateigröße speichern
    • Du kennst dann die Menge der zu kopierenden Bytes / kByte / MBytes ...
    • Dann iterierst Du über die Dateien
    • Wenn Du möchtest, dass auch während des Kopierens einer Datei die Farbe wechseln soll, dann musst Du nach dem Kopieren eines definierten Menge, feststellen, ob n/6 der Gesamtdatenmenge kopiert wurde. Wenn ja, LED-Farbe ändern
    • Wenn Du das nicht möchtest, dann machst Du die Änderung der LED-Farbe von n/6 der Dateianzahl abhängig
    • Das Blinken erreichst Du, indem Du z.B. nach Kopieren von 100.000 Bytes die LED einschaltest, bei den näöchsten 100 Bytes ausschaltet (Stichwort Exklusiv-ODER-Verknüpfung - das spart Dir die while-Schleife


    Das ist die Variante, bei der Du "mehr" Programmieren lernst.


    Wenn Du das so nicht machen willst, dann muss Dein Kopierprogramm ein Skript starten, das nichts anderes macht als

    Code
    LED AN
    warten
    LED AUS
    warten


    Wenn das Kopierprogramm fertig ist, schießt es das Blink-Skript ab. Wichtig dabei ist, dass das Blink-Skript im Hintergrund läuft.

    Das wird im Prinzip die Variante sein, die Dir die Python-Cracks empfehlen werden.


    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

    Einmal editiert, zuletzt von Andreas (30. Juni 2017 um 23:03)

  • Hi und danke, Andreas,
    die Überlegung hatte ich auch schon und hab sie erstmal zu Seite gelegt, da aufgrund der deutlich unterschiedlichen Dateigrößen das Blinken vermutlich unregelmäßig und eher langsam erfolgt (des handelt sich um RAW-Bilddateien, bei der das Kopieren eines Files schon mal 3 bis 10 Sekunden dauert). Mir würde ein regelmäßiges Blinken in einem Herzschlag-Rhytmus besser gefallen. Aber ich glaube, ich probiere deinen Vorschlag mal aus und sehe mir an, wie es mir gefällt.
    Als Alternative bin ich gerade auf das Stichwort "Async-Function" gestoßen, welche offensichtlich ab Python 3.5 im Gepäck ist. Werde mal schauen, ob ich schlau draus werde ...

  • Blöde Frage: Nutzt du vielleicht Tkinter? Denn dann könntest du auf explizites threading verzichten. Macht aber natürlich nur Sinn wenn du sowieso eine GUI haben willst ;)

    Fraglich wäre auch "wie" bzw "womit" du kopierst, denn da gäbe es wie immer mehrere Möglichkeiten - denkbar wäre hierbei nämlich auch einen Kopiervorgang zu wählen der im Hintergrund stattfindet aber dennoch ein 'progress' zurückmeldet.

  • Nix für ungut meigrafd,
    aber irgendwie schaffst Du es immer wieder den Eindruck zu vermitteln, dass Du es einfach nicht ab kannst, wenn ohne Dein Zutun eine Lösung gefunden wurde, mit der der TO zufrieden ist.
    Warum willst Du ihm das, was er sich da nur mit ein paar Tipps selbst erarbeitet hat, jetzt schlechtreden?

    cu,
    -ds-

  • Wieso "nicht abkönnen"? :-/

    Ich hab halt noch eine Idee - lass doch einfach den TO entscheiden ob er diese hören möchte oder nicht

    //EDIT: Ich rede nichts schlecht, aber wenn du schon so reingrätschst und versuchst andere/mir den Mund zu verbieten, könnte man damit dann doch anfangen:
    Anstatt stupide einfach nur "multithreading" als Tipp abzugeben, versuche ich lieber herauszufinden wie er es bisher probiert hat, welchen Weg er zum kopieren gewählt hat, und versuche dann erst mal einen Weg ohne threading zu finden. Natürlich kann das umständlicher und langwieriger sein als Dein Tipp, aber oftmals auch sinnvoller. Threading gilt es IMHO so gut es geht zu vermeiden.
    Mit solchem reingrätschsten deinerseits vergeht mir die Lust - wenn der TE/TO also daran doch Interesse haben sollte weiß ich nicht ob ich dann überhaupt noch motiviert bin ....
    BTW: Nur weil ein Thema bereits als Erledigt markiert ist bedeutet das nicht das man dort nichts mehr schreiben darf, denn sonst wäre der gesperrt. Wieso Du der Meinung bist Ich dürfte dann nichts mehr posten finde nicht nur ich seltsam - die Situation hatten wir schon öfters und andere äußerten sich dazu auch schon mal...

  • Kann es sein das du gerade nicht merkst wie unfreundlich du dich verhältst?

    "Wieso nicht abkönnen?" war keine Frage die mir erklärt werden sollte.

    Tue ich in jedem Thread in dem ich mich noch nicht geäußert habe, noch einen Post absetzen?
    Besteht evtl. die Möglichkeit das ich nicht 24/7 vor dem PC sitze und somit speziell in diesem Fall vielleicht erst gegen Abend den Thread entdeckt habe und mir dazu noch ein weiterer Ansatz eingefallen ist?
    Es ist ein Unterschied zwischen "nicht abkönnen" oder "noch eine Idee". Wieso aber ausgerechnet ich nichts mehr dazu schreiben darf, erschließt sich niemandem.

  • Ich habe nicht vor, Dich "zum Schweigen" zu bringen.
    Ich habe lediglich darauf hingewiesen, welchen Eindruck Dein Kommentar hervorruft.
    Das Stichwort ist "soziale Kompetenz" ...
    Mehr gibt's da aus meiner Sicht nicht dazu zu sagen.

    Dass Du da gleich so aus der Hose springst ...


    Wieso "nicht abkönnen"? :-/

    Ich hab halt noch eine Idee - lass doch einfach den TO entscheiden ob er diese hören möchte oder nicht

    //EDIT: Ich rede nichts schlecht, aber wenn du schon so reingrätschst und versuchst andere/mir den Mund zu verbieten, könnte man damit dann doch anfangen:
    Anstatt stupide einfach nur "multithreading" als Tipp abzugeben, versuche ich lieber herauszufinden wie er es bisher probiert hat, welchen Weg er zum kopieren gewählt hat, und versuche dann erst mal einen Weg ohne threading zu finden. Natürlich kann das umständlicher und langwieriger sein als Dein Tipp, aber oftmals auch sinnvoller. Threading gilt es IMHO so gut es geht zu vermeiden.
    Mit solchem reingrätschsten deinerseits vergeht mir die Lust - wenn der TE/TO also daran doch Interesse haben sollte weiß ich nicht ob ich dann überhaupt noch motiviert bin ....
    BTW: Nur weil ein Thema bereits als Erledigt markiert ist bedeutet das nicht das man dort nichts mehr schreiben darf, denn sonst wäre der gesperrt. Wieso Du der Meinung bist Ich dürfte dann nichts mehr posten finde nicht nur ich seltsam - die Situation hatten wir schon öfters und andere äußerten sich dazu auch schon mal...


    Kann es sein das du gerade nicht merkst wie unfreundlich du dich verhältst?

    "Wieso nicht abkönnen?" war keine Frage die mir erklärt werden sollte.

    Tue ich in jedem Thread in dem ich mich noch nicht geäußert habe, noch einen Post absetzen?
    Besteht evtl. die Möglichkeit das ich nicht 24/7 vor dem PC sitze und somit speziell in diesem Fall vielleicht erst gegen Abend den Thread entdeckt habe und mir dazu noch ein weiterer Ansatz eingefallen ist?
    Es ist ein Unterschied zwischen "nicht abkönnen" oder "noch eine Idee". Wieso aber ausgerechnet ich nichts mehr dazu schreiben darf, erschließt sich niemandem.

    spricht für sich selbst ...

    cu,
    -ds-

  • Ich habe nur gefragt ob er zufällig Tkinter nutzt, um damit auf eigenes threading verzichten zu können (after), und erwähnt dann das es "zum kopieren" mehrere Möglichkeiten gäbe und da auch eine bei sein könnte die im Hintergrund abläuft usw.. Ich hab weder irgend etwas schlecht gemacht noch die bisherigen Vorschläge in Frage gestellt:


    Blöde Frage: Nutzt du vielleicht Tkinter? Denn dann könntest du auf explizites threading verzichten. Macht aber natürlich nur Sinn wenn du sowieso eine GUI haben willst ;)

    Fraglich wäre auch "wie" bzw "womit" du kopierst, denn da gäbe es wie immer mehrere Möglichkeiten - denkbar wäre hierbei nämlich auch einen Kopiervorgang zu wählen der im Hintergrund stattfindet aber dennoch ein 'progress' zurückmeldet.

    Gleich darauf kommst Du daher und pöbelst mich an, dass ich dies oder jenes nicht abkönne, oder getan hätten:


    Nix für ungut meigrafd,
    aber irgendwie schaffst Du es immer wieder den Eindruck zu vermitteln, dass Du es einfach nicht ab kannst, wenn ohne Dein Zutun eine Lösung gefunden wurde, mit der der TO zufrieden ist.
    Warum willst Du ihm das, was er sich da nur mit ein paar Tipps selbst erarbeitet hat, jetzt schlechtreden?

    cu,
    -ds-


    (der bold Satz kam erst später dazu, was mich zu meinem EDIT im nachfolgenden Beitrag veranlasste)

    Und nun sprichst Du von "soziale Kompetenz"? :-/

    Wie wäre es wenn Du einfach mal den TO die Entscheidung überlasst, ob er mehr von meiner Idee wissen möchte?
    Ich versteh echt nicht wieso Du denkst das für andere zu entscheiden?
    Da wären wir nämlich auch gleich wieder bei Deinem Vorwurf "soziale Kompetenz" ....
    Ebenso wie _nur_ mir untersagen zu wollen das ich in "Erledigt" Themen nichts mehr schreiben dürfe....


    ...kindergarten...

  • Hallo,

    um mal auf's eigentliche Thema zurück zu kommen:

    Zitat

    Als Alternative bin ich gerade auf das Stichwort "Async-Function" gestoßen, welche offensichtlich ab Python 3.5 im Gepäck ist. Werde mal schauen, ob ich schlau draus werde ...


    Falls mal später wer über den Thread stoplert: `async` ist ab Python 3.5 ein Statement, keine Funktion. Damit kann man, in Kombination mit `await` Nebenläufigkeit von Coroutines regeln. Auf "magische" Weise läuft dadurch aber nichts parallel. Damit kann man regeln, dass sich Coroutines nicht gegenseitig blockieren.

    Das Problem ist hier, dass I/O - der ja bei der Datensicherung zwangsläufig auftritt - unter Python "blocking" ist, d.h. das Skript läuft erst weiter, wenn die Dateioperation abgeschlossen ist. Das kann man mit `async` / `await` zwar umgehen, aber das ist ein bisschen tricky. Wer ein bisschen mehr zu dem Thema lesen möchte: ich hatte diesen Thread im deutschen Python-Forum gestartet, da geht's nachher auch um asyncio und BlackJack liefert ein ziemlich gutes Beispiel, wie so was aussehen kann.

    Auch wenn ich meigrafds Meinung grundsätzliche Teile, dass manchmal zu schnell zu Threads gegriffen wird, ist das hier IMHO eine vernünftige Lösung. Vorausgesetzt, es kommt keine GUI zum Einsatz. Dann muss man natürlich auf die Möglichkeiten und Methoden des GUI-Frameworks zurück greifen.

    Gruß, noisefloor

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!