Frage

Meine Win32 App A1 (eigentlich eine Sammlung von Prozessen) versuchen CreateDirectory zu verwenden, um ein Verzeichnis D1 innerhalb geordneten Verzeichnis P. Den Pfad zu P ist der Wert des TMP Umgebungsvariable zu schaffen, die P macht eine potenziell viel los, aber im Allgemeinen permissive Ort. Die überwiegende Mehrheit der Zeit, alles funktioniert gut, aber selten, CreateDirectory ausfällt und GetLastError kehrt dann ERROR_ACCESS_DENIED, die Bedeutung in diesem Zusammenhang ist nicht dokumentiert.

Ich schrieb eine Testanwendung A2, die nichts tut, sondern wiederholt erstellen und ein Verzeichnis D2 so schnell löschen, wie es in P kann, und ich einen albernen langen Namen für D2 wähle, die ich bin zuversichtlich, nicht kollidieren mit jedem, dass jeder andere Programm verwenden würde. Einmal alle paar Minuten gibt es einen kleinen Bruchteil einer Sekunde, während der A2 Versuche D2 Ausbeute nur ERROR_ACCESS_DENIED Ausfälle zu erstellen.

A1 wird ziemlich beschäftigt in P während seines Laufs. Während A1 und A2 gleichzeitig ausgeführt wird, treten die Zeiten ERROR_ACCESS_DENIED Ausfall etwas häufiger, als wenn A1 und A2 für den exklusiven Zugriff auf P. konkurrieren (ich absolut sicher bin, dass A1 :-) nicht den gleichen Namen wie D2 verwenden.

Ich bin geneigt etwas zu nehmen ERROR_ACCESS_DENIED zu bedeuten „in wenigen Millisekunden wieder versuchen, und wenn das nicht funktioniert nach einigen Versuchen, aufgeben“, aber ich bin besorgt darüber, dass [a] in einigen Fällen bedeuten kann, etwas Dauerhaftes, dass ich sofort Beachtung schenken soll, und [b], weil ich nicht wirklich wissen, was los ist, kann es nicht möglich sein, sicher eine angemessene Menge an Zeit zu schaffen zu halten versuchen.

Wer Erfahrung mit diesem Produkt? Irgendein Rat? Von besonderem Wert an dieser Stelle wäre Hinweise darauf, was dies verursacht, damit ich das Problem leichter reproduzieren kann.

War es hilfreich?

Lösung

Du bist tot Recht. Die Dokumentation nicht einmal Liste ERROR_ACCESS_DENIED als möglicher Fehlercode für diese Funktion, so dass es auch ein Fehler sein kann.

ich tun würde, wie Sie vorschlagen eine Wiederholung / Backoff-Strategie bei der Umsetzung.

Mit anderen Worten, wenn Sie diesen Fehler erhalten, versuchen Sie es erneut bis zu dreimal ohne Verzögerung (offensichtlich an einer beliebigen Stelle stoppen hier, wenn Sie einen Nicht-Fehlercode erhalten), dann bis zu vier weitere Male mit Verzögerungen ( beispielsweise 100 Millisekunden, 500 Millisekunden, 1 Sekunde und 2 Sekunden).

Diese Art von Strategie (die ich vorher benutzt habe) wird in der Regel alle temporären Ressourcenknappheit um. Wenn Sie noch nicht das Verzeichnis nach 7 Versuchen erstellen und 3.6 + Sekunden, können Sie wahrscheinlich sicher davon ausgehen, es wird nicht passieren.

Ihre Funktion so hässlich wie (Pseudo-Code) sein könnte:

def createMyDir (dirname):
    if createDir (dirName) return true;
    if createDir (dirName) return true;
    if createDir (dirName) return true;
    sleep (100)
    if createDir (dirName) return true;
    sleep (500)
    if createDir (dirName) return true;
    sleep (1000)
    if createDir (dirName) return true;
    sleep (2000)
    return createDir (dirName);

Sie können jedoch wollen Sie machen es ein wenig eleganter:

def createMyDir (dirname):
    delay = pointer to array [0, 0, 0, 100, 500, 1000, 2000, -1]
    okay = createDir (dirName)
    while not okay and [delay] not -1:
        if [delay] not 0:
            sleep ([delay])
        delay = next delay
        okay = createDir (dirName)
    return okay
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top