Ich speichere eine Reihe von ~ 300 Bitmaps in einer gleichzeitigen Warteschlange. Ich mache das für ein Over-TCP-Video-Streaming-Programm. Wenn der Server langsamer wird, speichere ich die empfangenen Bitmaps in dieser Warteschlange (Pufferung). Ich habe ein separates Projekt erstellt, um das zu testen, aber ich habe einige Probleme.Lesen und Schreiben aus der Warteschlange
Während der Schreib-Thread funktioniert (Schreiben in die Warteschlange), zeigt das Bildfenster die Bilder aus der Warteschlange, aber es scheint, dass es viele von ihnen überspringt (es ist so, als lese es gerade in der "Liste" durch den Schreib-Thread-nicht-FIFO-Verhalten). Wenn der Schreib-Thread die Bildbox beendet, blockiert er, obwohl die Schleife, in der ich aus der Warteschlange lese, immer noch arbeitet (wenn die Bildbox die Warteschlange blockiert, ist sie nicht leer).
Hier ist der Code:
Imports System
Imports System.Drawing
Imports System.IO
Imports System.Threading
Imports System.Collections.Concurrent
Public Class Form1
Dim writeth As New Thread(AddressOf write), readth As New Thread(AddressOf read)
Dim que As New ConcurrentQueue(Of Bitmap), finished As Boolean
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
'Start button
writeth.Start()
readth.Start()
End Sub
Sub draw(ByRef pic As Bitmap)
If PictureBox1.Image IsNot Nothing Then
PictureBox1.Image.Dispose()
PictureBox1.Image = Nothing
End If
PictureBox1.Image = pic
End Sub
Sub read()
Dim bit As Bitmap
While (Not finished Or Not que.IsEmpty)
If que.TryDequeue(bit) Then
draw(bit.Clone)
'Still working after the writing stopped
If finished Then Debug.Print("picture:" & que.Count)
Thread.Sleep(2000) 'Simulates the slow-down of the server
End If
End While
End Sub
Sub write()
Dim count As Integer = 0
Dim crop_bit As New Bitmap(320, 240), bit As Bitmap
Dim g As Graphics = Graphics.FromImage(crop_bit)
For Each fil As String In Directory.GetFiles(Application.StartupPath & "/pictures")
count += 1
Debug.Print(count)
bit = Image.FromFile(fil)
g.DrawImage(bit, 0, 0, 320, 240)
que.Enqueue(crop_bit)
bit.Dispose()
Next
finished = True
'At this point the picture box freezes but the reading loop still works
End Sub
End Class
kein Fehler ist. Ich denke, dass es möglicherweise Kopien in der Warteschlange gibt (weil das Bildfeld einzufrieren scheint)? Ich habe den gleichen Code mit ganzen Zahlen ausprobiert und es funktioniert perfekt. Was ist das Problem?
Es ist möglich, dass Sie eine nicht gemeldete Ausnahme erhalten. Da es aussieht, als ob nur 3 von 4 Objekten entsorgt werden, wird vielleicht der gefürchtete Generic GDI Fehler oder etwas anderes geworfen, wenn Ihnen die Objekte ausgehen – Plutonix
Was meinst du? Ich entsorge nur das Bild Boc-Bild und eine Bitmap ("Bit"). Meinst du das? –