Programm stürzt immer ab!

Engfer

Grünschnabel
Hallo,
ich bin nicht der VB-Freak, nutze eigentlich VB6 nur für Sachen, die ich nicht mit Clickexe3 hinbekomme.

Zu meinem Problem:
Ich habe ein Programm geschrieben, mit welchem ich eine Textdatei (Dat_Sender.txt) auslese.

Inhalt:
4

2400
ATZXL3
26
1/1:Kommunikationsausfall


Aufgrund dieser Daten wird die Rufnummer angerufen.

Danach soll sich das Programm beenden.

Das VB-Script sieht folgendermaßen aus:

Dim schnittstelle As Integer
Dim amt As String
Dim baudrate As String
Dim inizialisierung As String
Dim rufnummer As String
Dim empfaengerrufnummer As String
Dim meldung As String
Dim setting As String
Dim modemantwort As String
Dim t As Integer
Dim stufe As Integer


Private Sub abbrechen_Click()
abbrechen.Enabled = False
abbrechen.Visible = False
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
Print #1, "Abbruch" + Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Close #1
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'MSComm1.PortOpen = False
End Sub


Private Sub Form_Load()
Let stufe = 0
'Daten von FRM übernehmen
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Input As #1
Input #1, schnittstelle
Input #1, amt
Input #1, baudrate
Input #1, inizialisierung
Input #1, empfaengerrufnummer
Input #1, meldung
Close #1
'Textfelder füllen
'Let meldetext.Text = meldung
Let empfaenger.Text = empfaengerrufnummer
'Setting String (Schnittstelleneinstellung) zusammenstellen
Let setting = baudrate + ",N,8,1"
'Schnittstelle vorbereiten
MSComm1.CommPort = schnittstelle
'MsgBox schnittstelle
MSComm1.Settings = setting
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
MSComm1.SThreshold = 1
MSComm1.InputLen = 0
'Initialisierungsstring senden
ini(0).Visible = True
MSComm1.Output = inizialisierung + Chr(13)
For t = 0 To 10000: Next
melde1(0).Visible = True
waehle(1).Visible = True
MSComm1.Output = "ATX3DT" + amt + empfaengerrufnummer + Chr(13)
stufe = 3
melde2(1).Visible = True
'verbindung(0).Visible = True
MSComm1.Handshaking = comRTS

End Sub

Private Sub Form_Unload(Cancel As Integer)
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'MSComm1.PortOpen = False
End Sub

Private Sub MSComm1_OnComm()
modemantwort = MSComm1.Input
'modemantwort = Replace$(modemantwort, Chr(13), "")
'modemantwort = Replace$(modemantwort, Chr(10), "")
Text1.Text = Text1.Text + modemantwort ' + Chr(13)
If stufe = 3 Then
If InStr(1, modemantwort, "NO CARRIER") <> 0 Then
'MsgBox "NO CARRIER!"
'melde2(1).Caption = "ERROR!"
'melde2(1).ForeColor = &HFF&
'melde2(1).Visible = True
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
Print #1, "Ruf_ok" + Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Close #1
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'End
'Unload Me
End If
If InStr(1, modemantwort, "BUSY") <> 0 Then
'MsgBox "NO CARRIER!"
'melde2(1).Caption = "ERROR!"
'melde2(1).ForeColor = &HFF&
'melde2(1).Visible = True
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
Print #1, "Ruf_ok" + Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Close #1
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'End
'Unload Me
End If
End If
If stufe < 3 Then
If InStr(1, modemantwort, "NO CARRIER") <> 0 Then
'MsgBox "NO CARRIER!"
melde2(1).Caption = "ERROR!"
melde2(1).ForeColor = &HFF&
melde2(1).Visible = True
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
Print #1, "Fehler" + Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Close #1
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'End
'Unload Me
End If
If InStr(1, modemantwort, "ERROR") <> 0 Then
'MsgBox "ERROR!"
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
Print #1, "Fehler" + Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Close #1
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'End
'Unload Me
End If
If InStr(1, modemantwort, "NO DIALTONE") <> 0 Then
'MsgBox "NO DIALTONE!"
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
Print #1, "Fehler" + Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Close #1
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'End
'Unload Me
End If
If InStr(1, modemantwort, "BUSY") <> 0 Then
MsgBox "BUSY!"
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
Print #1, "Fehler" + Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Close #1
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'End
'Unload Me
End If
If InStr(1, modemantwort, "NO ANSWER") <> 0 Then
'MsgBox "NO ANSWER!"
Open "C:\Funkruf-Manager\Dat_Sender.txt" For Output As #1
Print #1, "Fehler" + Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Print #1, Chr(13)
Close #1
Unload Telefon_Fenster
Set Telefon_Fenster = Nothing
'End
'Unload Me
End If
End If
If InStr(1, modemantwort, "OK") <> 0 Then
'MsgBox "Test bestanden - OK"
If melde1(0).Visible = True Then
melde2(1).Visible = True
'verbindung(0).Visible = True
End If
melde1(0).Visible = True
End If

End Sub


Leider ist es so, dass das Programm beim 1. Mal super funktioniert, allerdings ab dem 2. oder 3. Programmstart wird das Fenster nicht mehr geöffnet und das Programm steht im Task-Manager, kann aber nicht geschlossen werden, in den meisten Fällen wird kann man den PC sogar nicht mehr herunterfahren!

Ich habe die Befürchtung, dass das Programm nicht richtig beendet wird.

Wer kann helfen?

Andreas
 
Um das Programm endgültig zu Beenden benutze am Bestern den End-Befehl, zum Beispiel in Form_Unload oder am Ende der "letzten" Prozedur.
 
Ich habe Deine Lösung ausprobiert - leider ohne Erfolg.

Desweiteren habe ich folgende Entdeckung gemacht:
Ich habe das Modem nun testweise mit dem Hyperterminal angesprochen. Das funktioniert optimal. Als ich aber das Hyperterminal geschlossen und danach wieder gestartet habe ist das Hyperterminal genau so abgestürzt - selbst WinXP ließ sich nicht mehr herunterfahren.

Ich denke mal, dass das Problem eher beim Modem/Treiber zu suchen ist.

Trotzdem danke!

Andreas
 
Original geschrieben von Shakie
Um das Programm endgültig zu Beenden benutze am Bestern den End-Befehl, zum Beispiel in Form_Unload oder am Ende der "letzten" Prozedur.

Lieber nicht.

Wer "End" benutzt, würde als Busfahrer an der letzten Haltestelle den Bus
sprengen, statt die letzten Fahrgäste freundlich hinauszubefördern.
Auf Deutsch:
Bei End hat das Programm keine Möglichkeit, noch
irgendwelche Aufräumarbeiten durchzuführen.
Ein Programm endet automatisch, wenn die letzte Form ge-unloadet wird.
Wenn also Deine Sub Main ohne ein End nicht terminieren will, wird
irgendeine Form nicht richtig entladen.

Gruß
Jens
 
Ein Programm endet automatisch, wenn die letzte Form ge-unloadet wird.
Das stimm so aber auch nicht!
Beispiel: Man setzt einen Timer auf eine Form. In der Timer-Sub schreibt man nun Code, der sehr viel CPU-Leistung in Anspruch nimmt.
Wenn nun das Unload-Ereignis der Form eintritt, bleibt der Timer einfach aktiv (ich spreche aus Erfahrung) und das Programm läuft noch, obwohl alle Formen ge-unloadet sind!
 
Original geschrieben von Shakie
Beispiel: Man setzt einen Timer auf eine Form. In der Timer-Sub schreibt man nun Code, der sehr viel CPU-Leistung in Anspruch nimmt.
Wenn nun das Unload-Ereignis der Form eintritt, bleibt der Timer einfach aktiv (ich spreche aus Erfahrung) und das Programm läuft noch, obwohl alle Formen ge-unloadet sind!

Ich will mich nicht mit dir streiten oder dir zunahe treten aber.
das stimmt wohl so und das habe ich mir auch nicht so einfach
ausgedacht sondern so von wirklichen Profis gelernt.
Scheinbar werden die Forms zwar geschlossen aber im Hintergrund
ist eine noch aktiv und das liegt am fehlerhaften Code.
Eine Form wird eben nicht richtig entladen. Das sieht man
auch daran das die Temporären Dateien die VB anlegt dann nicht
gelöscht werden.

Wozu soll ein Timer gut sein der Windows oder dein Programm
so blockiert das es nicht nicht richtig beendet ?
Wie wäre es den Intervall etwas zu verkürzen.

Bei sauberer Programmierung reicht immer der Unload Befehl.
Ich habe selbst schon solche Probleme gehabt, aber es immer
ohne End hinbekommen.

Gruß
Jens
 
Zurück