BASS.dll im Thread.Execute -> SigSegV

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

BASS.dll im Thread.Execute -> SigSegV

Beitrag von Thandor »

Hi,

Ich versuche gerade in Freepascal eine Classe mit der BASS.dll zu schreiben. Leider bekomme ich einen Fehler "External: SIGSEGV". Ich konnte den Fehler auf die Procedure Execute meines Threads eingerenzen.

Code: Alles auswählen

//-----------------------------------------------------------------------------
  Procedure Channel.Execute;
//-----------------------------------------------------------------------------
  Begin
    Repeat
      BeginGlobalLoading;
 
      IF BASS_ChannelGetLength  (Stream, BASS_POS_BYTE) =
         BASS_ChannelGetPosition(Stream, BASS_POS_BYTE) then Begin
        IF not SinglePlay then Begin
          BASS_StreamFree  (Stream);
          IF CurrentFile <= Length(Playlist)-1 then // Playliste ohne Repeat
            INC (CurrentFile)
          else                                      // Playliste mit Repeat
            IF PlaylistRepeat then CurrentFile := 0;
 
          IF CurrentFile <= Length(Playlist)-1 then Begin
            Stream := BASS_StreamCreateFile (FALSE,
                                             PCHAR(Playlist[CurrentFile]),
                                             0, 0, Flags);
            BASS_ChannelPlay (Stream, FALSE);
          end;
 
          LastError := BASS_ErrorGetCode;
        end; {not SinglePlay}
      end; {Ende der Datei}
 
      EndGlobalLoading;
    Until Terminated;
  end; {Execute}
Er bringt den Fehler schon bei den Zeilen:

Code: Alles auswählen

IF BASS_ChannelGetLength  (Stream, BASS_POS_BYTE) =
   BASS_ChannelGetPosition(Stream, BASS_POS_BYTE) then Begin
Was mache ich falsch? Ich bin im Bereich der Threads noch etwas wakelig auf den Beinen...

MfG
Thandor
channelclass.pas
Die Klasse
(8.5 KiB) 82-mal heruntergeladen
ChannelClassTest.lpr
Mein Testprogramm für ChannelClass.pas
(1.42 KiB) 74-mal heruntergeladen

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: BASS.dll im Thread.Execute -> SigSegV

Beitrag von Euklid »

Hallo Thandor,
Thandor hat geschrieben:Ich versuche gerade in Freepascal eine Classe mit der BASS.dll zu schreiben. Leider bekomme ich einen Fehler "External: SIGSEGV". Ich konnte den Fehler auf die Procedure Execute meines Threads eingerenzen.
Du kannst Die Zeile, in der die Zugriffsverletzung geschieht, mithilfe der heaptrc-Unit leicht ausfindig machen:
Einfach in der Compiler-Einstellungen unter "Linken" die Zeilennummern aktivieren, die heaptrc aktivieren und "Debuggersymbole entfernen" DEaktivieren.
Anschließend das Programm unter "Start-->Alles kompilieren" neu kompilieren.
Anschließend das Programm von der Konsole aus öffnen und den Fehler provozieren.

Wenn der Fehler auftritt gibt die Heaptrc den Aufrufstack zurück, d.h. in der obersten Zeile der Ausgabe ist der Fehler entstanden. Die darunter liegenden Zeilen geben Hinweise darauf, von wo aus die Prozedur aufgerufen wurde. DIe Heaptrc-Ausgabe wird beim Schließen des Programms dann nochmal ausführlicher.

Viele Grüße, Euklid

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: BASS.dll im Thread.Execute -> SigSegV

Beitrag von carli »

Greifst du in dem Thread auf Variablen zu, auf die du zur gleichen Zeit auch von außen zugreifst?

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: BASS.dll im Thread.Execute -> SigSegV

Beitrag von Thandor »

Hi,

Alle Elemente des Threads werden mittels Methoden, die in dem Thread implementiert sind gesetzt.
Allerdings weiß ich nicht, wie die Bass.dll arbeitet, ich denke mal, dass sie auch eine Thread erstellt....

Wenn ich jedoch ein Delay (15) vor das 1. IF der Execute-Schleife packe, dann stürzt er nicht mehr ab (aufjedenfall bei Soundfiles mit normaler Größe, große Files werde ich mal Testen)...

MfG
Thandor

carli
Beiträge: 657
Registriert: Sa 9. Jan 2010, 17:32
OS, Lazarus, FPC: Linux 2.6.x, SVN-Lazarus, FPC 2.4.0-2
CPU-Target: 64Bit

Re: BASS.dll im Thread.Execute -> SigSegV

Beitrag von carli »

Dann sichere jeden Punkt mit CriticalSections ab, bei dem auf threadinterne Variablen zugegriffen wird.

Thandor
Beiträge: 153
Registriert: Sa 30. Jan 2010, 18:17
OS, Lazarus, FPC: Windows 10 64Bit/ lazarus 3.0 mit FPC 3.2.2 (32Bit + 64bit)
CPU-Target: 64Bit
Wohnort: Berlin

Re: BASS.dll im Thread.Execute -> SigSegV

Beitrag von Thandor »

Hi,

kannst du mir ein Beispiel für die CriticalSections geben ?

MfG
Thandor

Antworten