![]() |
Netzwerkabbrüche oder Programm schließt sich einfach
Hallo liebe Community,
weiß kein Rat. Habe mehrere Anwendungen in Lazarus geschrieben. Mein Problem ist, sobald ich diese Tools auf ein Laufwerk im Netzwerk lege und von dort aus auf den Clients verknüpfe (also die Anwendungs.exe) habe ich das Problem, das es öfters mal vorkommt das sich das Programm einfach so schließt. Woran kann das liegen bzw. wie kann man sowas abfangen? Danke im voraus. Matthias |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Falls Lazarus auch PEFlags setzen kann, Versuche das hier in deiner .dpr Datei einzufügen:
Delphi-Quellcode:
//0x0400 IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP If the image is on removable media, copy and run from the swap file.
//0x0800 IMAGE_FILE_NET_RUN_FROM_SWAP If the image is on the network, copy and run from the swap file. {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP} |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Vielen Dank KodeZwerg
muss gestehen, das ich scheinbar nicht genug Ahnung habe um das umzusetzen was du als Lösung geschrieben hast. :-D 8-) |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Ich bin ungeeignet um eine Antwort zu geben die sich auf Lazarus beschränkt aber in Delphi Worten erkläre ich es Dir gerne.
Delphi-Quellcode:
ist eine Direktive.
{$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP}
Eine Anweisung an den Compiler etwas spezielles in die .exe Datei zu schreiben. Dieses spezielle ist in diesem Fall IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP und IMAGE_FILE_NET_RUN_FROM_SWAP. Das Bewirkt das die .exe Datei beim start voll in den Speicher geladen wird, das sollte Abstürze über Netzlaufwerke verhindern. Die .dpr Datei ist in Delphi die Projekt-Datei mit der alles beginnt. Ich hoffe es ist verständlich. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
bei Lazarus müsste das dann die .lpr sein, würde ich sagen. Kann ich das direkt in die Datei schreiben?
program project1; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset Forms, datetimectrls, printer4lazarus, Unit1, Unit2, Unit3, Unit4, Unit5, Unit6, Unit7, Unit8, Unit9, Unit10, Unit11, Unit12, Unit13, Unit14 { you can add units after this }; {$R *.res} begin RequireDerivedFormResource := True; Application.Initialize; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm3, Form3); Application.CreateForm(TForm4, Form4); Application.CreateForm(TForm5, Form5); Application.CreateForm(TForm6, Form6); Application.CreateForm(TForm7, Form7); Application.CreateForm(TForm8, Form8); Application.CreateForm(TForm9, Form9); Application.CreateForm(TForm10, Form10); Application.CreateForm(TForm11, Form11); Application.CreateForm(TForm12, Form12); Application.CreateForm(TForm13, Form13); Application.CreateForm(TForm14, Form14); Application.Run; end. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Das ist schonmal die korrekte Datei! Es kann sein das Du bei uses noch "Windows" einbinden musst für die deklaration der Flags, ansonsten passt es so.
Delphi-Quellcode:
...
uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} Interfaces, // this includes the LCL widgetset Forms, datetimectrls, printer4lazarus, Unit1, Unit2, Unit3, Unit4, Unit5, Unit6, Unit7, Unit8, Unit9, Unit10, Unit11, Unit12, Unit13, Unit14 { you can add units after this }; {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP} ... edit Beim zweiten mal raufschauen was Du da in uses lädst, ist Dein Ziel-System Windows? Mein tipp gilt nur für Windows Anwendungen! |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Fehlermeldung - {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP} project1.lpr(19,2) Error: Identifier not found "IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP"
Nutze ich nur {$SetPEFlags} kompiliert Lazarus erfolgreich. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Es ist nicht ratsam aber man kann es auch so machen:
Delphi-Quellcode:
Das gilt nur für Windows-Anwendungen!
{$SetPEFlags $400 or $800}
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
es funktioniert. :-D Ab jetzt beobachten wie sich die Programme so verhalten im Netzwerk.
Vielen Dank bis hierher. Ich melde mich, falls es noch nicht reicht. 8-) Edit: ich lasse das Topic hier noch offen |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Da ich noch keine Antwort auf meine Frage ob Ziel-System Windows ist habe ich hier eine Limitation dafür eingebaut.
Ich würde es vielleicht so machen:
Delphi-Quellcode:
So wäre es vielleicht die sicherere Methode? Entscheide Du!
uses
{$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} {$IFDEF Windows} Windows, {$ENDIF} Interfaces, // this includes the LCL widgetset Forms, datetimectrls, printer4lazarus, Unit1, Unit2, Unit3, Unit4, Unit5, Unit6, Unit7, Unit8, Unit9, Unit10, Unit11, Unit12, Unit13, Unit14 { you can add units after this }; {$IFDEF Windows} {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP} {$ENDIF} |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Sorry - Ja der Server und die Clients sind alles Windows Maschinen
-habe es nochmal mit deinem letzten Beitrag versucht, da kommt aber wieder die Fehlermeldung "project1.lpr(21,2) Error: Identifier not found "IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP"" Code >>> program project1; {$mode objfpc}{$H+} uses {$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} {$IFDEF Windows} Windows, {$ENDIF} Interfaces, // this includes the LCL widgetset Forms, datetimectrls, printer4lazarus, Unit1, Unit2, Unit3, Unit4, Unit5, Unit6, Unit7, Unit8, Unit9, Unit10, Unit11, Unit12, Unit13, Unit14 { you can add units after this }; {$IFDEF Windows} {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP} {$ENDIF} {$R *.res} begin RequireDerivedFormResource := True; Application.Initialize; Application.CreateForm(TForm1, Form1); Application.CreateForm(TForm2, Form2); Application.CreateForm(TForm3, Form3); Application.CreateForm(TForm4, Form4); Application.CreateForm(TForm5, Form5); Application.CreateForm(TForm6, Form6); Application.CreateForm(TForm7, Form7); Application.CreateForm(TForm8, Form8); Application.CreateForm(TForm9, Form9); Application.CreateForm(TForm10, Form10); Application.CreateForm(TForm11, Form11); Application.CreateForm(TForm12, Form12); Application.CreateForm(TForm13, Form13); Application.CreateForm(TForm14, Form14); Application.Run; end. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Dann fehlen Deiner "Windows.pas" diese Deklarationen oder in Lazarus ist das woanders abgelegt, da bin ich überfragt.
Hier ist die uses wieder bereinigt und die PE-Flags werden nur gesetzt wenn ein Windows Kompilat entsteht. Ich empfehle Dir mal nach IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP in zusammenhang mit Lazarus zu Suchen, das ist keine so abnormale Konstante.
Delphi-Quellcode:
uses
{$IFDEF UNIX}{$IFDEF UseCThreads} cthreads, {$ENDIF}{$ENDIF} {$IFDEF Windows} //Windows, {$ENDIF} Interfaces, // this includes the LCL widgetset Forms, datetimectrls, printer4lazarus, Unit1, Unit2, Unit3, Unit4, Unit5, Unit6, Unit7, Unit8, Unit9, Unit10, Unit11, Unit12, Unit13, Unit14 { you can add units after this }; {$IFDEF Windows} const IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = $0400; { If Image is on removable media, copy and run from the swap file. } IMAGE_FILE_NET_RUN_FROM_SWAP = $0800; { If Image is on Net, copy and run from the swap file. } {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP} {$ENDIF} {$R *.res} |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Großes Lob an dich!! So funktioniert es ohne Fehlermeldungen.
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Da Du noch Neu bist mit Programmieren verrate ich Dir auch Warum :)
Ich zerpflücke mal Dein Text und kommentiere hier und da
Delphi-Quellcode:
uses // <- Wir fangen an Units einzubinden die hier gebraucht werden
{$IFDEF UNIX} // <- Wenn Wir Unix verwenden Bedingung {$IFDEF UseCThreads} // <- Wenn Wir UseCThreads verwenden Bedingung cthreads, // <- treffen beide Bedingungen zu, lade diese Datei und stelle Inhalt zur Verfügung {$ENDIF} // das schließt die letzte $IFDEF Bedingung {$ENDIF} // das schließt die letzte $IFDEF Bedingung {$IFDEF Windows} // <- Wenn Wir Windows verwenden Bedinung // Hier sollten alle Units rein die man unter Windows benötigt // Windows, // Da bei Dir "Windows.pas" nicht die Flags enthält brauchen Wir "Windows.pas" auch nicht zu laden // mit zwei schrägen Strichen am Anfang kann man übrigens Kommentare im Source hinterlassen // oder wie hier getan die Anweisung "Windows," damit rauskommentiert. {$ENDIF} // das schließt die letzte $IFDEF Bedingung ... {$IFDEF Windows} // <- Wenn Wir Windows verwenden Bedinung const // const Werte sind feste Werte, alles was man hier deklariert bleibt im Normalfall so wie es ist IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = $0400; { If Image is on removable media, copy and run from the swap file. } IMAGE_FILE_NET_RUN_FROM_SWAP = $0800; { If Image is on Net, copy and run from the swap file. } // Da Deinem Lazarus die Deklaration IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP und IMAGE_FILE_NET_RUN_FROM_SWAP fehlten // haben Wir die auf diese Weise selbst hinzugefügt // Deswegen klappt letztendlich auch das Integrieren dieser speziellen Flags {$SetPEFlags IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP or IMAGE_FILE_NET_RUN_FROM_SWAP} {$ENDIF} // das schließt die letzte $IFDEF Bedingung |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Das nenne ich ja mal eine ausführliche Erklärung. DANKE
Gehen wir mal zurück zum Anfang. Was mich da interessiert ist, wenn wir all diese Anweisungen nicht in den Sourcecode hinterlegen (wie am Anfang geschehen) wie oder was wird denn da überhaupt geladen? (nur ein Teil des Programmes ) |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Ohne diese Flags lädt Windows Deine .exe nur bei Bedarf in Speicher, was bei Netzlaufwerken oder CDRoms Fehler verursachen kann.
Beispiel man startet eine Datei von einem Usb-Laufwerk, wenn man das Usb-Laufwerk rauszieht stürzt früher oder später das Programm ab weil es an entsprechender Stelle keine Daten mehr findet. Mit diesen Flags gesetzt lädt Windows die Datei komplett in den Speicher was zur Folge hat das ein trennen des Laufwerks nicht gleich die Applikation crashen lässt da die Daten nun aus dem Speicher geholt werden. Dein Problem kann natürlich auch an völlig anderer Stelle sein, das hier wäre nur eine generelle Empfehlung für .exen die nicht Lokal vorliegen. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Super Sache. Ich werde es in Zukunft mit beachten. Danke nochmal an dieser Stelle an dich. :thumb:
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Ja gern geschehen. Wenn es das schon war, wars ja einfach:P
Teste mal ausgiebig, bei weiteren Fehlern muss man sich den Code anschauen, aber wenn ich schon unit1, unit2, unit3 usw. Lese ahne ich schlimmes ^_^ Ps: Der Text-Editor von diesem Forum für Nachrichten hat als Knopf ein Delphi-Symbol, wenn Du wieder Code hier zeigst drücke vorher auf den Knopf und schreibe Deinen Code zwischen die [ Delphi]...Dein Code...[ /Delphi]. Dann liest es sich einfacher und formatierung bleibt ein wenig bei. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Oha... :shock: , das mit den Units würde ich gerne mal näher erläutert haben. Erstellt doch Lazarus diese Units mit jedem neuen Formular von alleine. Das Thema passt aber leider nicht zu diesem Thread.
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Meine schlimme Vorahnung hast Du ja bereits mit "Erstellt doch Lazarus diese Units mit jedem neuen Formular von alleine." bewahrheitet.
Es ist ratsam jedes Element Sinnvoll zu benennen, wenn Du in 5 Jahren noch Spass an Lazarus hast und Deinen alten Code rausbuddelst möchtest Du bestimmt nicht erst Tagelang checken "ach was ist Unit666; ist CheckBox666 für Button666 zuständig; wie lautet der Name im allgemeinen". Das hilft Dir selbst und ist für jeden der damit zu tun hat einfach leserlicher. Ein wenig Struktur kann nie Schaden. Nun brauchst Du dafür keinen neuen Thread erstellen, nur im Hinterkopf behalten das Standardnamen doof sind :-] Wenn man es sich gleich "gut" angwöhnt schadet es nach hinten hin nie. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Stimmt :-D das ist mir schon öfters mal aufgefallen. (gerade wenn man nach Wochen mal wieder in den Code schaut) Da muss ich mich noch mehr anstrengen um gleich die richtigen Bezeichner zu verwenden. Danke für den Tipp.
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Eine Ergänzung noch. Du hast jetzt das Symptom bekämpft, aber nicht die Ursache. Ein Netzlaufwerk, das sich "mal abhängt" ist natürlich nicht ok . Wenn dein Programm andere Dateien benötigt (Templates, Einstellungen, INIs ..), dann sind die dann ja auch nicht verfügbar.
Vielleicht magst du das mitbedenken. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Hi TigerLilly, yes ich habe einige Verbindungen (zb Ini, SQL..) Hast du da einige Tipps für mich?
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Ini kannst Du in System-Registrierung auslagern, DB Dateien könnte man in den Windows-Temp verlagern.
Generell bei Lese- Schreibzugriffe egal welcher Art immer vorher testen ob das Ziel gültig ist bevor man drauf losgeht. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Zitat:
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Netzwerkverbindungen zu debuggen ist sehr mühsam, weil so viele Komponenten im Spiel sind: Kabel/WLAN, Router, Hubs, Netzwerkkarten, Serverhardware. Ganz übel ist es, wenn die Probleme nicht dauerhaft sind. zB Wackelkontakt im Netzwerkkabelstecker.
Ich würde damit beginnen, mir in den Rechnern die Logs anzusehen, ob da was drinsteht, ob ein Muster zu erkennen ist. dann würde ich einen Monitor aufsetzen, der die Verbindungen monitored. Und dann kommt das Durchmessen der Kabel und tauschen der Komponenten. Aber das hängt natürlich immer sehr von deiner IT Landschaft ab, was du da hast. Vielleicht hat es auch nur mit der Netzwerklast zu tun, dass das Nachladen der EXE zu lange dauert, vielleicht gibt es da ein Timeout, das weiß ich aber nicht, ob das sein kann. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Das mit den Ini und System-Registrierung habe ich nicht verstanden (Wissensmangel) , bei den SQL Abfragen vorher also immer erst die Connection prüfen. OK.
Was mir aber auch mal aufgefallen ist, das ist selten der Zufall aber wenn zwei Personen gleichzeitig auf eine Datenbank zugreifen - hat einer Pech da Datenbank gerade geöffnet von dem anderen. Ist es möglich das mehrere Personen im selben Moment darauf zugreifen können und gleichzeitig hineinschreiben können.:? |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Zitat:
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Danke für die Tipps
Zitat:
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Multi-User , verschiedene User greifen auf dieselben Datenbanken zu. (warum dann die Windows Temp , die ist doch lokal?)
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Für Lazarus und System-Registrierung habe ich
![]() Oder wenn das zu Kompliziert ist vielleicht ![]() Ja ne, bei Multi-User natürlich DB da lassen wo sie ist und Code für Multi-User Zugriffe anpassen bzw hör auf TigerLilly! |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Wenn die .INI auf dem Server liegt, dann steht sie allen Benutzern zur Verfügung.
Ob ein normaler Nutzer an die Registry des Servers heran kommt möchte ich erst einmal bezweifeln. Zum anderen sollte es unwichtig sein welches OS der Fileserver hat. Gruß K-H |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Nun ja... leider immer noch dasselbe Phänomen. Programm schließt sich einfach ohne irgendeine Fehlermeldung mitten im Betrieb.
Testlauf wie folgt 1) Programm lokal auf Rechner gestartet - läuft stundenlang ohne Abbrüche 2) Programm vom Netzwerk aus gestartet - Abbruch der Anwendung ohne Fehlermeldung (es gibt keinen festen Rhythmus wann es passiert) Weiß jemand noch Rat? :pale: |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Zitat:
|
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Ok nochmal zurück auf Anfang.
Zitat:
Vor allem wie hast Du "dort aus auf den Clients verknüpfe" realisiert? Wenn das fehlschlägt, warum gibst Du keine Fehlermeldung aus? Und pep doch Dein Programm mit einem Ablauflog auf. Dann solltest Du die Fehlerstelle zumindest eingrenzen können. Gruß K-H |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
Versuch zu klären:
- ein Virenscanner killt die Software - die Netzwerkverbindung wird unterbrochen - die Zuordnung des Laufwerksbuchstaben wird geändert Du solltest aber auch diese Fragen versuchen zu klären + was dagegen tun: - Warum bekommst du von deiner Software keine Fehlermeldung? - Warum weißt du nicht, an welcher Stelle das passiert? Abhilfe: - Ablaufverfolgung mit einem detailliertem Log - Monitoren von Netzwerk + allem, was die Software braucht Probier es mit einem Workaround, wenn der Kunde schon tobt: - Mach anstelle des Programmaufrufs einen Batchjob, der die EXE nach lokal kopiert + starte sie dann. |
AW: Netzwerkabbrüche oder Programm schließt sich einfach
64bit DLLs?
DB Client libraries können schon troubles machen, da die in der Regel in purem C implementiert sind und damit keine Exception handeln. Bist du dir sicher, dass du die selben Client DLLs ziehst, wenn du die Applikation übers Netz startest? Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:39 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz