Also mich machen diese Zeilen ja stutzig
Delphi-Quellcode:
procedure TForm2.SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin
// Synchronisieren - ok, wenn man in einem anderen Thread-Kontext ist, macht das manchmal Sinn
TThread.Synchronize(TThread.CurrentThread, SampleBufferSync);
// äh, wenn wir in einem anderen Thread-Kontext sind,
// dann doch bitte keinen direkten Zugriff auf die Controls
//Resize the image so that the video is buffered in its original size
Image1.Width:=Image1.Bitmap.Width;
Image1.Height:=Image1.Bitmap.Height;
end;
procedure TForm2.SampleBufferSync;
begin
VideoCamera.SampleBufferToBitmap(Image1.Bitmap, true);
end;
Des Weiteren können wir
hier lesen
Zitat:
Warnung: Rufen Sie Synchronize nicht aus dem Haupt-Thread auf. Dies kann zu einer Endlosschleife führen.
Somit kann dieser Code
niemals richtig sein!
- Die Methode wird im Haupt-Thread aufgerufen, dann ist TThread.Synchronize
falsch
- Die Methode wird nicht im Haupt-Thread aufgerufen, dann darf aber auch nicht auf Image1
zugegriffen werden
Ich würde diese Zeilen mal abändern auf
Delphi-Quellcode:
procedure TForm2.SampleBufferReady(Sender: TObject; const ATime: TMediaTime);
begin
if MainThreadID = TThread.CurrentThread.ThreadID then
SampleBufferSync
else
TThread.Synchronize(TThread.CurrentThread, SampleBufferSync);
end;
procedure TForm2.SampleBufferSync;
begin
// Hier sollten wir uns auf jeden Fall im MainThread befinden
VideoCamera.SampleBufferToBitmap(Image1.Bitmap, true);
//Resize the image so that the video is buffered in its original size
Image1.Width:=Image1.Bitmap.Width;
Image1.Height:=Image1.Bitmap.Height;
end;
und dann sehen was passiert ...
PS: Auf meinem Mac ist die noch nicht einmal abgestürzt
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)