Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Firemonkey - ungültige Zeigeroperation

  Alt 20. Feb 2014, 00:53
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!
  1. Die Methode wird im Haupt-Thread aufgerufen, dann ist TThread.Synchronize falsch
  2. 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)

Geändert von Sir Rufo (20. Feb 2014 um 00:57 Uhr)
  Mit Zitat antworten Zitat