Hilfe bei der Programmierung sehr kurzer Verzögerungen

baba017

Grünschnabel
Hallo zusammen,
ich bin neu in der .Net-Programmierung und habe ein Problem mit einer kleinen Anwedung, die ich als Test geschrieben habe.
Das Programm soll einen Port der LPT Schnittstelle mit einer bestimmten Frequenz an und ausschalten. Für die Verzögerung nutze ich eine Zählschleife. Soweit funktioniert das Programm wie gewünscht.
Zusätzlich zeige ich den Portzustand in einem Label mit BackColor an. Nun mein Problem.
Wenn ich das Programm starte (Button1) läuft alles wie gewünscht. Sobald allerdings die Form den Focus verliert, d.h. ich ein anderes Fenster auf dem Desktop anklicke, friert die Form ein. Mit einem weiteren klick auf die Form kommt dann die Fehlermeldung in derFensterleiste "Keine Rückmeldung". Die eigentliche Programmfunktion Port ein- ausschalten funtioniert aber ohne Probleme weiter.
Warum steigt die Form aus?
Wenn ich die Verzögerung über einen Timer programmiere läuft alles normal weiter.

Ich möchte Zählschleifen verwenden, da ich für eine spätere Anwendung sehr kurz Verzögerungen brauche (kleiner 1ms) als einschwingverzögerung für die angeschlossene Hardware. Dafür habe ich auch dieses Testprogrammgeschrieben.

Daher noch einmal meine Fragen:

Wie verhindere ich, dass das Programmfenster einfriert, wenn es einmal den Focus verliert?

Weiss jemand eine andere Möglichkeit sehr kurz Verzögerungen zu programmieren?

Mache ich mir evtl. umsonst sorgen und spielt der Verlust des Focus bei nur kurzen und sich nicht dauernd wiederholenden Schleifen keine Rolle?

Hat jemand schon ähnliche Erfahrungen gemacht?

Schon jetzt Dank für eure Antworten

mfg baba

Anhang: Mein Programmtext


Public Class Form1

Public Declare Function Inp Lib "inpout32.dll" Alias _
"Inp32" (ByVal PortAddress As Integer) As Integer

Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" _
(ByVal PortAddress As Integer, ByVal Value As Integer)


Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Rechteck_out(250000000)

End Sub

Sub Rechteck_out(ByVal Count As Integer)

Do
'D1 einschalten von D0 - D7 (Pin 3)
Out(&H378S, 2) 'Out(&H378=gibt den Anschluss (LPT1) an, 255=alle an 0=alle aus)
Me.Label1.BackColor = Color.Lime
Me.Refresh()
Zeitschleife(Count)

'D1 ausschalten
Out(&H378S, 0)
Me.Label1.BackColor = Color.Red
Me.Refresh()
Zeitschleife(Count)
Loop

End Sub

Private Sub Zeitschleife(ByVal ZahlMax As Integer)
Dim Za As Integer = 0

Do Until Za = ZahlMax
Za += 1
Loop

End Sub

End Class
 
Hi und willkommen im Forum.

Schau dir mal das Thema Timer an. Damit kannst du dir die Schleifen sparen.
Zudem solltest du Refresh nicht auf die komplette Form aufrufen sondern nur auf das Control, was sich geändert hat.
Besser wäre hier jedoch der Einsatz von Application.DoEvents.

Und bitte pack Quellcode in die entsprechenden Code-Tags (code, vbnet, csharp, sql, ....)
 
Hallo Nico,

besten Dank für deine Antwort.
Die Lösung lag im Aufruf Application.DoEvents.
Danach hatte ich gesucht. Nun läuft alles wie gewünscht.

Nochmal Danke
 

Neue Beiträge

Zurück