Hallo wer-weiss-was-ler,
ich möchte einen Visual basic 2010 code, welcher ein Photo per webcam macht und dieses dann in einer picture box anzeigt dreimal wiederholen und dann in einer jeweils neuen picturebox anzeigen lassen.
Dazu hätte ich eine For-schleife benutzt und dieses i der for-schleife also Variable für meine Pictureboxen.
Doch das einfügen der Variable i in den code der picturebox macht irgendwie probleme. Haben Sie eine idee wie das gehen könnte?
mein code:
Private Sub Button3\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) \_
Handles Button3.Click
Dim i As Integer
anfang:
For i = 2 To 6
If Not [Handle].Equals(IntPtr.Zero) Then
w32.MyHandle = [Handle]
Dim img As Image = w32.GetImage()
If img IsNot Nothing Then
um dieses i -----\> (Me.PictureBox&"i").Image = img
End If
Else
MessageBox.Show("Es ist ein Fehler aufgetreten.", "Info")
End If
Next i
GoTo anfang
End Sub
Grundsätzlich müsste der code doch funktionieren oder?
vielen dank für eure mühe
michael
Hallo,
ich hab noch eine frage, wenn ich jetzt das mit der for-schleife weg lasse und einfach den code 3 mal (mit veränderter picturebox2,3,4) hintereinander schreib müsste es ja eigentlich gehen.
wenn ich zwischen diesen boxen dann ein
threading.thread.sleep(1000)
einfüge, soll das Programm 3 mal hintereinander im Abstand von 1sec ein Photo machen und in der Entsprechenden Picturebox abspeichern.
Doch irgendwie bleibt das Programm einfach nur kurz stehen und speichert dann in alle 3 Pictureboxen das gleiche Bild ab.
Ist der code
threading...
falsch oder warum ist das so?
Wenn ich das mit einzellnen buttons ausführe(manuell sozusagen) geht das ganze ja auch.
hier noch einmal meinen code so wie ich mir das vorstelle
Private Sub Button3\_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) \_
Handles Button3.Click
If Not [Handle].Equals(IntPtr.Zero) Then
w32.MyHandle = [Handle]
Dim img As Image = w32.GetImage()
If img IsNot Nothing Then
Me.PictureBox2.Image = img
End If
Else
MessageBox.Show("Es ist ein Fehler aufgetreten.", "Info")
End If
Threading.Thread.Sleep(1000)
If Not [Handle].Equals(IntPtr.Zero) Then
w32.MyHandle = [Handle]
Dim img As Image = w32.GetImage()
If img IsNot Nothing Then
Me.PictureBox3.Image = img
End If
Else
MessageBox.Show("Es ist ein Fehler aufgetreten.", "Info")
End If
End Sub
Vielen dank
Michael
Tipp: Niemals (damit meine ich NIEMALS) in einer Windowsanwendung Thread.Sleep() aufrufen.
Grund: Jeder Prozess (also auch dein Programm) kann verschiedene Threads haben. Jeder Thread arbeitet seine Aufgaben eine nach der anderen ab. Die Threads laufen also (wenn genug Kerne da sind) parallel. Innerhalb eines Threads läuft aber alles nach einander (sequentiell). Jetzt gibt es einen speziellen Thread, genannt GUI-Thread, der lauscht die ganze Zeit auf Windowsmeldungen und verarbeitet die. Das sind z. B. Buttonklick, Fenster neu malen, Fenster verschoben, Maus verschoben, und viele mehr. Hast du dich für ein Ereignis registriert (z. B. ButtonX_Click), dann wird das aufgerufen. Solange dein Code läuft, kann der GUI-Thread nicht mehr lauschen, weil er ja deinen Code ausführen muss. Normalerweise ist das kein Problem, weil den Text eines Labels ändern dauert nur Bruchteile einer Sekunde. Wenn du aber Sleep() aufrufst, dann blockiert das den GUI-Thread, was in einem Hängen oder „Reagiert nicht mehr“ resultiert. Genau das gleiche passiert, wenn du in Ereignissen lang andauernde Operationen durchführt, z. B. Pi auf 1.000.000 Nachkommastellen berechnen.
Nimm zum regelmäßigen tun von etwas lieber einen Timer, der kommt mit Intervallen von 1 Sekunde gut zurecht, vorausgesetzt, das was er tut dauert kürzer. Denn der Timer führt sein Ereignis „Tick“ auch im GUI-Thread aus.
Grüße, JasonDelife.