Schleifen und Uhrzeit

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Heinz H
User
Beiträge: 3
Registriert: Freitag 26. Juni 2020, 18:58

Hallo ich habe ein kleines problem mit der Uhrzeit :/

ich versuche mit der derzeitigen uhrzeit als variable zu arbeiten, weil ich 2 schleifen habe welche sich eventuell in die quere kommen und das will ich nicht.
deswegen möchte ich das die Erste schleife alle 2-5min (zeitpunkt kann ich selber bestimmen)ausführt und die zweite soll ungefähr jede Stunde ausgeführt werden.

Kann jemand vorschlagen wie das funktionieren kann? :?
Sirius3
User
Beiträge: 17797
Registriert: Sonntag 21. Oktober 2012, 17:20

Da fehlt zu viel Kontext. Was willst du konkret machen? Was hast du bisher versucht? Code? Was tut nicht so, wie du dir das vorstellst?
Heinz H
User
Beiträge: 3
Registriert: Freitag 26. Juni 2020, 18:58

OKay also ich habe einen Code geschrieben welcher mein Spiel automatisiert und da müssen in verschiedenen abständen bestimmte punkte/knöpfe gedrückt werden
und ich möchte verhindern das sich beide schleifen irgendwann überschneiden
Ich hab da so an die Uhrzeit gedacht das die 2te Schleife jede Stunde ausgeführt wird und die 1te alle 2 minuten

Code: Alles auswählen

import pyautogui
import time

x = 10
y = 11
time.sleep(10)

while x > 0:

    time.sleep(1)
    pyautogui.click(435, 81)
    time.sleep(1)
    pyautogui.click(267, 16)
    time.sleep(2)
    pyautogui.click(267, 16)
    time.sleep(2)
    pyautogui.click(267, 16)
    time.sleep(10)
    
    pyautogui.click(592, 18)
    time.sleep(1)
    pyautogui.click(592, 18, 1, button='right')
    time.sleep(1)
    pyautogui.click(590, 50)
    time.sleep(120)
    
while y > 0:
    
    time.sleep(359)
    pyautogui.click(240, 80)
    time.sleep(1)
    pyautogui.click(221, 338)
    time.sleep(1)
    pyautogui.click(206, 86)
    time.sleep(33)
    
    
Benutzeravatar
sparrow
User
Beiträge: 4231
Registriert: Freitag 17. April 2009, 10:28

Das ist ja verrückt. Du hast zufällig genau den selben Code geschrieben wie Lasse.B in dem anderen Thread.

Und auch hier gilt: Mach dir keine Sorgen. Die beiden Schleifen werden sich niemals in die Quere kommen.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn all die Energie, die hier in das austricksen eines Systems gesteckt wird, für etwas nützliches verwandt würde - es würde mich nicht wundern, wenn dabei in der Summe mehr Geld bei rumkommt....
locky20
User
Beiträge: 4
Registriert: Samstag 27. Juni 2020, 15:56

Code: Alles auswählen

import datetime
import time

def new_foo(delay):
 
    dastestamp = datetime.datetime.now().strftime('%Y-%d-%m %H:%M:%S')
    future_date = datetime.date.strftime(datetime.datetime.now() + datetime.timedelta(seconds=int(delay)), '%Y-%d-%m %H:%M:%S')
    foo = 1
    while True:
        if datetime.datetime.now().strftime('%Y-%d-%m %H:%M:%S') != future_date:
            print("Not reached: ", )
            print(datetime.datetime.now().strftime('%Y-%d-%m %H:%M:%S'), future_date )
            print('\n')
            time.sleep(1)
        else:
            print("reached...")
            future_date = datetime.datetime.now().strftime('%Y-%d-%m %H:%M:%S') + datetime.timedelta(seconds=int(delay)), '%Y-%d-%m %H:%M:%S')
            dastestamp = datetime.datetime.now().strftime('%Y-%d-%m %H:%M:%S') 
            print("Unendliche Geschischte {} geht weiter: {} -- {} ").format(foo,  future_date, dastestamp))
            
new_foo(60)

Eine While Schleife ist nicht besonders praktikabel, die Schleife des Todes.
Wenn Du ein Script zu einem Zeitpunkt X oder auch auch alle paar Minuten ausführen möchtest, dann würde ich dir den von OS zur Verfügung gestellten Scheduler (Cron unter Linux und Task Scheduler unter WIN) empfehlen.
Sirius3
User
Beiträge: 17797
Registriert: Sonntag 21. Oktober 2012, 17:20

@locky20: Warum arbeitet du die ganze Zeit mit Strings statt mit datetime-Instanzen? Exakt die Sekunde zu treffen ist schwierig. Da würde man besser mit >= arbeiten.
locky20
User
Beiträge: 4
Registriert: Samstag 27. Juni 2020, 15:56

Weil now() gibt folgendes zurück

Code: Alles auswählen

>>> datetime.datetime.now()
datetime.datetime(2020, 6, 28, 11, 12, 24, 132042)
ansonsten müsste man die Millisekunden aus dem Datetime entfernen, ausserdem liest es sich einfacher und lässt sich besser vergleichen. Die eine Sekunde wird es unmöglich zu treffen, wenn time.sleep umgestellt wird.
Bei Größer/Gleich wird es ungenauer, das heißt, das Ziel wird auch erreicht wenn es meinetwegen bei 61en sec. ist.
War nur ein sinnloses Beispiel, du kannst ja gerne spielen und Vergleichsoperatoren durchprobieren. Das ist das guten am Programmieren, viele Wege führen nach Rom!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist zwar richtig, das viele Wege nach Rom führen. Der via den Lofoten ist aber trotzdem eine schlechte Wahl, wenn man in der BRD lebt. Wenn man zwei Zeitstempel mit einer gewissen Unschärfe vergleichen will, kann man das einfach so machen:

Code: Alles auswählen

a = datetime.now()
b = datetime.now()
abs(a - b) < timedelta(seconds=1)
Benutzeravatar
__blackjack__
User
Beiträge: 13202
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@locky20: Die Erklärung kann ich nicht nachvollziehen. Weder liest sich das einfacher noch lässt sich da etwas leichter vergleichen. Das hat auch nie einen Compiler gesehen, denn an dem kommt es nicht vorbei — da ist eine Zeile die wohl einfach nur eine Kopie einer anderen Zeile sein sollte, die aber syntaktisch nicht hin haut. Und auch die Zeile danach ist syntaktisch nicht richtig.

Dann ist mir echt ein Rätsel was `dastestamp` wohl bedeuten mag, und was `foo` in der Funktion machen soll.

`datetime.now()` wird viel zu oft aufgerufen. Da entstehen Zeiten die so dann überhaupt gar nicht mehr zusammenpassen.

`strftime()` wird zweimal fälschlicherweise auf der `datetime.date`-Klasse als Funktion aufgerufen statt die Methode auf dem Objekt zu verwenden, dass dort übergeben wird.

Die beiden `int()`-Aufrufe sind unnötig.

Das `time.sleep()` ist ein Problem weil das nicht exakt die angegebene Zeit wartet, sondern auch etwas weniger oder etwas mehr warten kann. In je mehr kleinere Wartestückchen man die Zeit einteilt um so öfter wird es aufgerufen und um so mehr kleine Fehler können sich aufsummieren.

`future_date` ist mehr als ein Datum, der Name also nicht so ganz treffend.

Hier mal ohne den Unsinn alles immer in Zeichenketten umzuwandeln (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import time
from datetime import datetime as DateTime, timedelta as TimeDelta

#
# TODO Sinnvollen Funktionsnamen finden.
#
def new_foo(delay):
    delta = TimeDelta(seconds=delay)
    future_timestamp = DateTime.now().replace(microsecond=0) + delta
    while True:
        now = DateTime.now()
        if now >= future_timestamp:
            print(
                f"Not reached:\n{now:%Y-%d-%m %H:%M:%S} {future_timestamp}\n\n"
            )
            #
            # FIXME Das hier ist ein Problem weil sich die Ungenauigkeiten
            #   dieser Funktion aufaddieren.
            #
            time.sleep(1)
        else:
            print("reached...")
            previous_future_timestamp = future_timestamp
            future_timestamp = previous_future_timestamp + delta
            print(
                f"Unendliche Geschichte geht weiter:"
                f" {future_timestamp} -- {previous_future_timestamp}"
            )


if __name__ == "__main__":
    new_foo(60)
Bei der Ausgabe mit der unendlichen Geschichte denke ich mal das die Reihenfolge der Ausgabe falsch ist. Was man viel besser sieht wenn man die Namen aussagekräftig gewählt hat.
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
locky20
User
Beiträge: 4
Registriert: Samstag 27. Juni 2020, 15:56

@__blackjack__
Ein Typisch deutsches Forum, zu Blöd oder zu Faul eigene Lösung publik zu machen, aber erstmals bei allen anderen nach Fehlern zu suchen (man sehe es an deinen Beiträgen) und darauf hinzuweisen, was sie aus eigener Sicht falsch gemacht wurde.
Von solch einer Arroganz / Idioten habe ich die Nase gestrichen voll, dich haben‘s wohl als Kind zu oft vom Wickeltisch fallen gelassen.

Weshalb sollte man eine vollständige Lösung, publik machen, da soll jeder selbst entscheiden, was die beste Lösung für sich ist, Du arrogantes A******.
Benutzeravatar
__blackjack__
User
Beiträge: 13202
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@locky20: Ich habe eine eigene Lösung gegeben in dem anderen Thema das den Quelltext um den es geht als erstes enthalten hat → Es braucht keine Lösung damit sich die beiden Schleifen nicht in die Quere kommen, denn das tun sie nie.

Falls Du Probleme mit konstruktiver Kritik an Deinem Quelltext hast, dann zeige ihn halt nicht öffentlich. Wenn man etwas in einem Forum postet, muss man halt mit Antworten rechnen. Nicht nur in deutschsprachigen Foren.

Beleidigt oder gar beleidigend zu reagieren, wirkt nicht wirklich souverän…
“There will always be things we wish to say in our programs that in all known languages can only be said poorly.” — Alan J. Perlis
Antworten