Hey Leute,
ich habe hier ein Proggy, dass zur Steuerung und zum Streaming von einem Receivertyp dient. Dabei habe ich ein Problem mit Abstürzen, die ich bisher nicht in den Griff bekommen habe.
Bei mir tritt nie ein Problem auf und bei vielen anderen auch nicht. Bei manchen Leuten gibt es aber regelmäßig scheinbar unmotivierte Abstürze.
Das hängt mit einer Funktion zusammen, die alle 10 Sekunden den EPG abruft und die Daten in ein Array schreibt.
(Das ist relativ ineffizient, weil ich die Daten eigentlich nur zum Anzeigen der Senderübersicht brauche. Das will ich auch ändern, aber den Fehler würde ich dennoch gerne verstehen, damit ich es in Zukunft besser machen kann.)
Anhand der Fehlermeldung aus der Konsole, die ich vom kompilierten Programm mit einer zweiten Programminstanz abfange (das gibts auch hier im Forum ich glaube von CheaterDieter), weiß ich die Zeile und den Fehler:
==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
Die Daten, die ich in eine Textdatei lade sehen so aus, wobei die Liste teilweise natürlich viel länger ist. Das sind die EPG Informationen über die gerade laufenden Sendungen:
5554043700012b66 1423024200 12600 303711504893903373 ZDF-Morgenmagazin
5554043700016d70 1423036200 2700 303711506001848303 Disco
5554043700016d6e 1423035600 2700 303711506001709186 Da kommt Kalle
5554043700016d6b 1423035000 2700 303711506001500791 Land unter Kontrolle
4294041b00012b5c 1423024200 12600 295830205545347489 ZDF-Morgenmagazin
Spoiler anzeigen
local $EPGdaten[1500][5] ; Vor der Funktion. Fest auf 1500 EPG Events begrenzt. Das war bisher auch scheinbar nicht das Problem.
Func Bsp()
If Not FileExists($PfadT & "Gt") Then InetGet($URLstart & $IP & ":" & $Webserver_Port & "/control/epg?ext", $PfadT & "Gt", 1, 1)
If FileExists($PfadT & "Gt") Then
$CopyEPGraw = FileCopy($PfadT & "Gt", $PfadT & "G", 1); hiermit versuche ich sicherzugehen, dass die Datei wirklich vollständig geladen ist, nachdem es auch mit InetGetInfo zu Abstürzen kam.
For $i = 0 To 25
If Not ($CopyEPGraw = 1) Then
Sleep(10)
Else
ExitLoop
EndIf
Next
EndIf
If FileExists($PfadT & "G") Then
Local $b2, $btemp
_FileReadToArray($PfadT & "G", $b2)
If IsArray($b2) Then
$m = UBound($b2)
;~ Global $EPGdaten[$m][5]; Das habe ich auskommentiert, weil die Neudeklaration lange dauerte. so habe ich das Array fest auf 1500 Einträge Einträge gesetzt.
Local $Sendung[$m][2]
For $l = 1 To $m - 1
If Not StringIsSpace($b2[$l]) Then ; Einfach mal hilflos geprüft, das keine Leerzeilen in den Daten sind.
StringReplace($b2[$l], " ", "_")
If @extended >= 4 Then ; Hier wollte ich sichergehen, dass auch wirklich 4 Splits möglich sind.
$aSplit = StringSplit($b2[$l], " ")
$EPGdaten[$l][0] = $aSplit[1] ; SenderID ; HIER TRITT DER FEHLER AUF. !!!!!!!!!!
$EPGdaten[$l][1] = $aSplit[2] ; Startzeit
$EPGdaten[$l][2] = $aSplit[3] ; Dauer
$EPGdaten[$l][3] = $aSplit[4] ; SendungsID
$atemp = StringSplit($b2[$l], " ")
For $j = 1 To $atemp[0]
If $j <= 4 Then ContinueLoop
$Sendung[$l][1] &= $atemp[$j] & " " ; Sendung
$EPGdaten[$l][4] = StringTrimRight($Sendung[$l][1], 1)
Next
EndIf
EndIf
Next
_ArrayDelete($EPGdaten, 0)
EndFunc
Für jeden Tipp bin ich dankbar.
Grüße autoiter