Heizung.tar.gz
- (134.92 KiB) 74-mal heruntergeladen
[Gelöst] Sigsegv Error bei delay Aufruf
-
- Beiträge: 32
- Registriert: Mi 14. Aug 2019, 16:33
- OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
- CPU-Target: 64Bit / 32 Bit
- Wohnort: Umland München
Re: Sigsegv Error bei delay Aufruf
Habe das Projekt einmal hochgeladen. Wurde auf einem 32 Bit Raspberry 4 erstellt. Habe das mal testweise auf 64 Bit Linux laufen lassen. Wird zumindest geladen. Farben sind anders, Funktionen natürlich nur eingeschränkt, da keine Relais angeschlossen. Auf dem Raspberry funktionieren die Toggle Schalter jedoch korrekt. Ist noch im frühen Rohbau, daher einige Meldungen wegen nicht genutzter Units oder Variablen.
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Sigsegv Error bei delay Aufruf
Ich würde den Code im OnActivate zu einem Singleton umformen
FInit ist eine Variable in der Form, die im Construktor Create auf false gesetzt wird. Damit läuft Startup nur einmal, egal welches BS.
Für das Delay würde ich eine Unitglobale Variable nehmen, Damit ist die Unit auch gleich besser entkoppelt und braucht keinen Verweis auf die GUI. Das sollte man sowieso immer vermeiden. Eine unit sollte für sich alleine stehen können und nur parametrisiert werden. Ausserdem würde ich überlegen aus dem GPIO Teil, ein Objekt zu machen und das auch als Singleton anzusprechen. Damit ist das komplett entkoppelt und kann nur einmal aufgerufen werden, was ja Sinn macht. Das ist dann schon Geschmackssache. Auch das Logwrite würde ich über einen Callback machen oder den LazLogger (Siehe wiki dazu) verwenden.
Code: Alles auswählen
procedure TFrmMain.FormActivate(Sender: TObject);
begin
// Finish init mainform
// At first call the form is shown and ready
if not FInit then begin
StartUp;
FInit:=True;
end;
end;
Für das Delay würde ich eine Unitglobale Variable nehmen, Damit ist die Unit auch gleich besser entkoppelt und braucht keinen Verweis auf die GUI. Das sollte man sowieso immer vermeiden. Eine unit sollte für sich alleine stehen können und nur parametrisiert werden. Ausserdem würde ich überlegen aus dem GPIO Teil, ein Objekt zu machen und das auch als Singleton anzusprechen. Damit ist das komplett entkoppelt und kann nur einmal aufgerufen werden, was ja Sinn macht. Das ist dann schon Geschmackssache. Auch das Logwrite würde ich über einen Callback machen oder den LazLogger (Siehe wiki dazu) verwenden.
Code: Alles auswählen
interface
procedure GPIODelay(AktDelay:integer);
implementation
var
FDelay: integer;
procedure GPIODelay(AktDelay:integer);
begin
FDelay := AktDelay;
end;
....
procedure GPIOSetForOutput (PIN : pChar);
var
fileDesc: integer;
sPIN : string2;
begin
sPIN := PIN;
{ Set SoC pin 17 as output: }
try
fileDesc := fpopen('/sys/class/gpio/gpio'+sPIN+'/direction', O_WrOnly);
gReturnCode := fpwrite(fileDesc, OUT_DIRECTION[0], 3);
{$ifdef GPIODebug}DebugLn({$I %FILE%} + '->' +{$I %CURRENTROUTINE%} + ' GPIO SetFOROutput'+SPIN,gReturnCode);{$endif}
finally
gReturnCode := fpclose(fileDesc);
{$ifdef GPIODebug}DebugLn({$I %FILE%} + '->' +{$I %CURRENTROUTINE%} + ' Close '+SPIN,gReturnCode);{$endif}
end;
delay (FDelay);
end;
....
initializone
FDelay := 80; // Standardwert
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
- fliegermichl
- Lazarusforum e. V.
- Beiträge: 1639
- Registriert: Do 9. Jun 2011, 09:42
- OS, Lazarus, FPC: Lazarus Fixes FPC Stable
- CPU-Target: 32/64Bit
- Wohnort: Echzell
Re: Sigsegv Error bei delay Aufruf
Wird denn dein Config Formular automatisch erzeugt?
Projekt -> Projekteinstellungen -> Formulare
Wenn es da bei verfügbare Formulare steht, dann wird es nicht automatisch erzeugt. In dem Fall musst du das selbst machen.
Projekt -> Projekteinstellungen -> Formulare
Wenn es da bei verfügbare Formulare steht, dann wird es nicht automatisch erzeugt. In dem Fall musst du das selbst machen.
Code: Alles auswählen
if (not (Assigned(Config))) then Config := TConfig.Create(Application);
// Jetzt kann man auf die Eigenschaften von Config zugreifen
- af0815
- Lazarusforum e. V.
- Beiträge: 6770
- Registriert: So 7. Jan 2007, 10:20
- OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
- CPU-Target: 32Bit (64Bit)
- Wohnort: Burgenland
- Kontaktdaten:
Re: Sigsegv Error bei delay Aufruf
Man darf sich nie darauf verlassen, wenn die Formulare mit den Resoucen erstellt werden. Das kann ziemlich ins Auge gehen. Ich lasse generell nur das Mainform erzeugen, alle anderen werden gezielt im Mainform erzeugt. Damit bekomme ich auf den verschiedenen Plattformen ein determiniatisches Verhalten. Auch kann ich damit sehr genau Festellen ob was schiefläuft, wenn zB. eine Resource (Com, Server, SPS,...) nicht verfügbar ist. Frei nach dem Motto, wenn was schiefläuft, dann sollte der User das sehen-damit kann er mir auch ein Foto per WA senden.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).
-
- Beiträge: 32
- Registriert: Mi 14. Aug 2019, 16:33
- OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
- CPU-Target: 64Bit / 32 Bit
- Wohnort: Umland München
Re: Sigsegv Error bei delay Aufruf
Das Programm wird nur auf dem Rasperry laufen. Routine wird nur einmal durchlaufen, aber aus welchen Gründen auch immer viel zu spät.Winni hat geschrieben: Fr 17. Jul 2020, 00:19 Vorsicht mit onActivate:
Je nach Betriebssystem wird das verschieden ausgeführt.
Ja, steht unter Projektinspektor bei automatisch erzeugt.fliegermichl hat geschrieben: Fr 17. Jul 2020, 09:57 Wird denn dein Config Formular automatisch erzeugt?
Habe ich geändert, ist in der Tat sauberer. Löst aber auch das grundsätzliche Problem nicht, dass die Resource nicht z.V. steht.af0815 hat geschrieben: Fr 17. Jul 2020, 06:43 Für das Delay würde ich eine Unitglobale Variable nehmen,
Jetzt erhalte ich bei dem Aufruf vom Main aus schon den SIGSEGV Fehler bei GPIODelay (Config.SpinEdit1.Value).
Habe jetzt mal ein kleines Testprogramm erstellt. Das macht genau das, was mein Programm machen sollte. Gleiche Struktur. Funktioniert in der richtigen Reihenfolge der Event Abarbeitung. Delay löst auch keinen SIGSEGV Fehler aus.
1. Beim Start geht es zuerst in OnActivate
2. Bei Buttom Klick 2 auf Event2 geht es auf 2
3. Bei Buttom 3 auf Event 3. Delaywert vom SpinEdit wird übergeben, delay ausfgeführt ohne Fehler.
Bei meinem Heizungsprogramm funktioniert das alles nicht.
1. Bei Start geht es "ohne das ich klicke" sofort in OnKlickPumpe2, 4, 6 und 8.
2. Ganz am Schluß geht es dann irgendwann doch noch in das OnActivate Event
3. Bei Übergabe des SpinEdit Delays vom Main aus kommt der SIGSEGV Fehler.
Am Comiler kann es auch nicht liegen, da die Fehler auf meinem64 Computer identisch nachproduzierbar auftreten.
Selbst wenn ich das Config Unit und die Config Form neu erstelle, bleibt der Fehler.
Habe mir gerade nochmal mein Strategie Testerprogramm angeschaut, hat viele 1000 Zeilen, unzählige Units und Formen, gleiches Konzept, nie Probleme.
Es muß also irgend etwas bei der Erstellung in diesem Miniprogramm vollkommen durcheinander geraten sein. Bleibt also nichts anders übrig als das Programm noch einmal vollständig neu aufzusetzen, da ich nicht den geringsten Plan habe, was die Ursache ist.
Mit Klimmzügen wie dem NIL, globale Variablen etc. könnnte ich das Problem zwar umschiffen aber nicht lösen.
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Sigsegv Error bei delay Aufruf
Ich habe dein Programm genauer angeguckt, wie du schreibst, da knallt es das erste mal.
Es ist schon interessant, das ToglelBox.Click aufgerufen wird.
Ich habe in einem neuen Projekt das OnClick einer ToggleBox, ausgewertet, da wird es erst aufgerufen, wen man auch rein clickt.
Noch etwas interessantes in deinem Projekt.
Du hast ParentFont auf False gestellt.
Wen ich dort reinklicke und auf True stelle, wird die Schrift auf dem Button Fett. Stelle ich aber wieder auf False, bleibt es immer noch Fett.
Code: Alles auswählen
procedure THeizung.TPumpe2Click(Sender: TObject);
begin
ShowMessage('click2');
GPIOSwitchRelais (PINPumpe2, TPumpe2.Checked);
IF TPumpe2.Checked
then TPumpe2.Color := clLime
else TPumpe2.Color := clRed;
end;
Ich habe in einem neuen Projekt das OnClick einer ToggleBox, ausgewertet, da wird es erst aufgerufen, wen man auch rein clickt.
Noch etwas interessantes in deinem Projekt.
Du hast ParentFont auf False gestellt.
Wen ich dort reinklicke und auf True stelle, wird die Schrift auf dem Button Fett. Stelle ich aber wieder auf False, bleibt es immer noch Fett.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Sigsegv Error bei delay Aufruf
Ich habe die Ursache gefunden, der Übeltäter ist XMLProbStorage1, wen ich diesen deaktiviere, wird kein Click mehr aufgerufen.Es ist schon interessant, das ToglelBox.Click aufgerufen wird.
Evtl. die Timer auch ausschalten, und erst in OnActivate einschalten. Das selbe mit XMLProbStorage1.
Da musst du selbst weiter probieren,
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 32
- Registriert: Mi 14. Aug 2019, 16:33
- OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
- CPU-Target: 64Bit / 32 Bit
- Wohnort: Umland München
Re: Sigsegv Error bei delay Aufruf
Ich habe jetzt mal alle Timer in den Eigenschaften deaktiviert, zusätzlich den Timercode auskommentiert und XMLPropStorage1 deaktiviert. Geht immer noch zuerst in die OnClick von Pumpen 2, 4 , 6, 8. Werde das aber mal weiter checken.Mathias hat geschrieben: Fr 17. Jul 2020, 17:53Ich habe die Ursache gefunden, der Übeltäter ist XMLProbStorage1, wen ich diesen deaktiviere, wird kein Click mehr aufgerufen.Es ist schon interessant, das ToglelBox.Click aufgerufen wird.
Evtl. die Timer auch ausschalten, und erst in OnActivate einschalten. Das selbe mit XMLProbStorage1.
Da musst du selbst weiter probieren,
Sorry Korrektur! Du hast natürlich Recht. Hatte versehentlich den XMLPropStorage1 con der Config Form deaktiviert. Beim Main PopStorage geht er nicht mehr in die OnClicks. An den Timern liegt es dann wohl nicht, da alle auskommentiert und abgeschaltet. Das hilft schon weiter.
-
- Beiträge: 32
- Registriert: Mi 14. Aug 2019, 16:33
- OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
- CPU-Target: 64Bit / 32 Bit
- Wohnort: Umland München
Re: Sigsegv Error bei delay Aufruf
Super, ein Problem schon mal gelöst. Habe den filename von session.xml geändert auf Session.xml. Jetzt geht er direkt in OnActive. Session.xml wurde ja neu geschrieben.
Die XML Datei sah eigentlich ok aus, hatte mir die gestern schon angesehen. Schien i.O. Dateiname war sowohl in den Eigenschaften als auch im Dateimanager erkennbar auf session.xml. War aber wohl doch nicht i.O.
Die XML Datei sah eigentlich ok aus, hatte mir die gestern schon angesehen. Schien i.O. Dateiname war sowohl in den Eigenschaften als auch im Dateimanager erkennbar auf session.xml. War aber wohl doch nicht i.O.
-
- Beiträge: 32
- Registriert: Mi 14. Aug 2019, 16:33
- OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
- CPU-Target: 64Bit / 32 Bit
- Wohnort: Umland München
Re: Sigsegv Error bei delay Aufruf
Was sagt man dazu. Das zweite Problem mit dem SIGSEGV Fehler hat sich damit auch wie von selbst gelöst. Die delay Werte werden sauber von dem SpinEdit übergeben. Das mit der Unit globalen Variable habe ich auch eingebaut und funktioniert.
Vielen, vielen Dank für Eure Hilfe. Geht doch nichts über das Lazarus Profi Team.
Vielen, vielen Dank für Eure Hilfe. Geht doch nichts über das Lazarus Profi Team.
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Sigsegv Error bei delay Aufruf
Daher mache ich XML Verwaltung lieber manuell über die Unit xmlconf.pas.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 32
- Registriert: Mi 14. Aug 2019, 16:33
- OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
- CPU-Target: 64Bit / 32 Bit
- Wohnort: Umland München
Re: Sigsegv Error bei delay Aufruf
Mit dem XMLPropStorage hatte ich schon häufiger Probleme. Daher schaue ich mir die xml Datei auch meistens zuerst an und prüfe ob die SessionProperities korrekt eingetragen wurden. Irgend ein Zusammenhang bei Fehlern war immer erkennbar. Nur hier wäre ich nie auf einen Zusammenhang gekommen. Werde mir die xmlconf.pas mal anschauen.Mathias hat geschrieben: Fr 17. Jul 2020, 19:23 Daher mache ich XML Verwaltung lieber manuell über die Unit xmlconf.pas.
-
- Beiträge: 32
- Registriert: Mi 14. Aug 2019, 16:33
- OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
- CPU-Target: 64Bit / 32 Bit
- Wohnort: Umland München
Sigsegv Error bei delay Aufruf
Mist, doch nicht ganz gelöst. Sobald ich die Pumpen schalte, geht er beim nächsten Start wieder zuerst in die OnClicks der zuletzt aktivierten Pumpen. Aber so komme ich weiter, da XMLPropStorage wohl der Übeltäter ist. Evtl. nutze ich XMLPropStorage nicht und schreibe eine eigenRoutine.
-
- Beiträge: 6910
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: [Gelöst] Sigsegv Error bei delay Aufruf
Was ich dir vorschlage, mache eine Classe, in diesem Constructor lädst du aus der xml die gespeicherten Zustände der Pumpen und schaltest die Pumpen entsprechend und setzt deine Togleboxen.
Beim schalten einer Toglebox setzt du die Pumpe entsprechend und setzt auch den Wert in der Classe, welche dan gleichzeitig auch in die xml speichert.
Die xml und die Pumpen sind dann immer synchron.
Beim schalten einer Toglebox setzt du die Pumpe entsprechend und setzt auch den Wert in der Classe, welche dan gleichzeitig auch in die xml speichert.
Die xml und die Pumpen sind dann immer synchron.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 32
- Registriert: Mi 14. Aug 2019, 16:33
- OS, Lazarus, FPC: Lazarus 2.0.8, FPC 3.0.4, Linux, (Windows 7)
- CPU-Target: 64Bit / 32 Bit
- Wohnort: Umland München
Re: [Gelöst] Sigsegv Error bei delay Aufruf
Es liegt nicht an dem XMLPropage. Ich "hatte" das jetzt anders gelöst. Ich habe ja auf der Config Form schon eine Pumpenliste, die die aktuellen Pumpennamen enthält. Diese Liste wird bei OnActive geladen und bei FormClose gespeichert. Das funktioniert auch.
Was liegt näher als dort auch den letzten Schaltzustand der Pumpen in einer unvisible Spalte zu speichern. Sobald jedoch in OnActive die Zeile
TPumpe2.Checked := Config.StringGridPumpeNme.Cells [2,2] = 'Checked'
ausgeführt wird, wird das OnClick der aktiven Pumpen ausgeführt, da die Standard Checked Eigenschaft im Objektinspektor bei allen Pumpen auf false steht.
Damit ist klar, das OnClick eben nicht nur auf einen Click reagiert, sondern auch auf eine Checked Veränderung. Das heißt, egal wie ich es speichern würde, wird bei den eingeschalteten Pumpen immer auch OnClick Event ausgelöst.
Was liegt näher als dort auch den letzten Schaltzustand der Pumpen in einer unvisible Spalte zu speichern. Sobald jedoch in OnActive die Zeile
TPumpe2.Checked := Config.StringGridPumpeNme.Cells [2,2] = 'Checked'
ausgeführt wird, wird das OnClick der aktiven Pumpen ausgeführt, da die Standard Checked Eigenschaft im Objektinspektor bei allen Pumpen auf false steht.
Damit ist klar, das OnClick eben nicht nur auf einen Click reagiert, sondern auch auf eine Checked Veränderung. Das heißt, egal wie ich es speichern würde, wird bei den eingeschalteten Pumpen immer auch OnClick Event ausgelöst.