Seite 1 von 1

NetErr()

Verfasst: Do, 26. Sep 2019 15:04
von Manfred
mal eine ganz allgemeine Frage, wenn DbUseArea() benutzt wird und es gibt Probleme damit, müßte dann nicht ein NetErr() abgefragt werden können? Oder noch anders gefragt, wie lange versucht Xbase++ eigentlich die Tabelle zu öffnen, bis es einen NetEror() geben würde? Kann das eingestellt werden?

Re: NetErr()

Verfasst: Do, 26. Sep 2019 15:30
von Tom
NetErr() geht nur auf .T., wenn die Tabelle nicht geöffnet werden konnte, weil sie im exklusiven Zugriff durch andere Benutzer ist - oder umgekehrt Du exklusiven Zugriff versuchst, die Tabelle aber anderswo (auch "shared") offen ist. Wenn also irgendwo jemand ein USE ... EXCLUSIVE gemacht hat und Du machst USE (mit oder ohne EXCLUSIVE), geht NetErr() anschließend auf .T., die Workarea ist leer. Bei anderen Öffnungsfehlern (Datei nicht vorhanden, korrupte Datei usw. usf.) feuert NetErr() nicht, stattdessen gibt es einen Laufzeitfehler.
Über DbeInfo() kann man LockRetry und LockDelay setzen, aber m.E. nicht so etwas wie "UseRetry". Das hat ja auch nicht wirklich Sinn. Jemand, der eine Tabelle exklusiv hält, macht das ja aus Gründen - die meistens nicht ein paar Millisekunden später wieder weg sind. Wenn Du aber von Deiner eigenen App weißt, dass es einen exklusiven Zugriff möglicherweise nur für ein paar Sekündchen gibt, weil mal eben gepackt werden muss, kannst Du die Wiederholung ja in einer Öffnungsfunktion programmieren.

Re: NetErr()

Verfasst: Do, 26. Sep 2019 15:36
von Manfred
Hi Tom,
es geht in dem Fall darum, das ich derzeit Probleme mit Mehrfachzugriff im Netz habe. Es kann ab und an eine Zeit dauern, bis das Programm eine DBF öffnen kann. (so meine vermutung) Dabei graut es aber aus und ist nicht mehr bedienbar für eine gewisse Zeit. Leider dauert diese Zeit manchmal etwas länger als der User bereit ist zu warten. Bis ich nun das Problem behoben habe möchte ich gerne einen Workaround programmieren, der zumindest auf sowas reagiert. Aber leider gibt es dann kein Feedback vom Programm sondern einfach nur Stillstand.

Re: NetErr()

Verfasst: Do, 26. Sep 2019 16:02
von Tom
Hallo, Manfred.

Mmh. Da würde ich eher an die Ursachen gehen. Entweder kaskadiert ein Virenscanner oder das Netz ist sehr schlecht konfiguriert.

Du kannst natürlich auch die Tabellenöffnung irgendwie in einen Thread legen, der nach einer gewissen Zeit gekillt wird, wenn er nicht antwortet, und bei Erfolg holst Du Dir die Workarea über den Zerospace. Aber, wie gesagt. Die Ursachenbekämpfung ist vermutlich sinnvoller.

Re: NetErr()

Verfasst: Do, 26. Sep 2019 16:38
von Manfred
Tom,
Du hast recht. Ursache bekämpfen ist besser. Die Ursache kenne ich vermutlich, aber sie läßt sich nicht so schnell aus der Welt schaffen. Mich würde aber auch direkt interessieren, warum das Programm so lange rumwerkelt und nicht früher aufgibt. Das würde mir schon für den Anfang reichen für den Lerneffekt.

Re: NetErr()

Verfasst: Do, 26. Sep 2019 16:49
von Tom
Das kannst Du mit Tools wie ProcMon herausbekommen: www.sysinternals.com

Re: NetErr()

Verfasst: Do, 26. Sep 2019 16:57
von Manfred
das Programm sagt mir was, aber was soll ich damit machen?

Re: NetErr()

Verfasst: Do, 26. Sep 2019 17:12
von HaPe
Hallo Manfred !
das Programm sagt mir was, aber was soll ich damit machen?
Auf dein Programm während des Problemfalles anwenden.
Damit siehst du welche Dateien es öffnet/schließt, in der Registry rumrödelt, auf dem Netzwerk Zugriffe durchführt, Stackaktivitäten usw..

Re: NetErr()

Verfasst: Do, 26. Sep 2019 17:24
von Tom
Genau. Das loggt alle Events und Requests und all dieses Zeug - und zeigt Dir, wie lange was braucht und was ggf. querfunkt. Du kannst filtern, beispielsweise auf Anwendungen oder, was hier vermutlich sinnvoller wäre, auf Verzeichnisse. Dann siehst Du, was genau passiert, wenn Deine Anwendung versucht, sich ein Handle auf eine Tabelle zu holen.