Entwickler-Ecke

Internet / Netzwerk - Image Stream


hibbert - Mi 07.07.04 22:04
Titel: Image Stream
Hi,
ich habe ein Image auf meiner Form. Dieses Image zeigt mir ein Bild meiner Webcam an.
Wie bekomme ich mein Webcam Bild in das Image? Ganz einfach:
Mit hilfe eines Timers speicher ich das Bild der Webcam in einem .bmp ab und lade dieses in das image, weil ich das Bild meiner Webcam nicht in einem Image erhalte.
So das geschieht nun alle zehntel sek. (umständlich, funzt aber:wink:).

So, nun möchte ich dieses Bild an einen Clienten schicken.

Dazue benötige ich ja die Komponenten von indy (Server / Client).

Das ist schonmal der QT vom Server:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
  FStream: TFileStream;
begin
  FStream := TFileStream.Create(getcurrentdir+'\1.bmp', fmOpenRead);
  try
    AThread.Connection.OpenWriteBuffer;
    AThread.Connection.WriteStream(FStream,true,true);
    AThread.Connection.CloseWriteBuffer;
  finally
    AThread.Connection.Disconnect;
    FStream.Free;
  end;
end;


Und der QT vom Clienten sieht so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Button1Click(Sender: TObject);
var
  FStream: TFileStream;
begin
try  Client.Connect(15000);  // in Indy < 8.1 leave the parameter away
    except
      on E: Exception do
        MessageDlg ('Fehler beim Verbinden:'#13+E.Message, mtError, [mbOk], 0);
    end;
//showmessage(inttostr(GetTickCount));
  FStream := TFileStream.Create(getcurrentdir+'\1.bmp', fmCreate);
  try
    Client.ReadStream(FStream, -1); // Stream empfangen
    FStream.Seek(0, soFromBeginning);
  finally
    FStream.Free; // Stream freigeben
  end;
fstream.Free;
end;


Doch damit empfange ich das Bild nur einmal, wenn ich dann die Procedure erneut ausführe, bekomme ich folgende Fehlermeldungen:
Fehlermeldung #1 hat folgendes geschrieben:
Zugriffsverletzung usw...

Fehlermeldung #2 hat folgendes geschrieben:
Die Verbindung besteht bereits


Die zweite Fehlermeldung kommt auch, wenn ich noch ein client.disconnect; einbaue....

Kann man das noch etwas eleganter lösen ??

thx hibbert


Keldorn - Do 08.07.04 16:33

Hallo

warum hast du in deiner buttonclick-proc 2xfstream.free stehen? über eine AV brauchst du dich dann nicht zu wundern.

Mfg Frank


MSCH - Do 08.07.04 16:34

kleiner Tip. Netzwerkconnections sind in der Regel asynchron. Das heisst open-send-disconnect gehen in der Regel schief.
Ergo: Connect dann in der Conntected-Methode:send-close und dann weiter im text.
grez
msch