AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Error Event für TIdTCPClient

Error Event für TIdTCPClient

Ein Thema von ByTheTime · begonnen am 11. Okt 2012 · letzter Beitrag vom 25. Okt 2012
Antwort Antwort
Benutzerbild von DataCool
DataCool

Registriert seit: 10. Feb 2003
Ort: Lingen
909 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Error Event für TIdTCPClient

  Alt 15. Okt 2012, 10:53
Hi,

beim Code den Du da gepostet hast gehe ich mal davon aus, das es sich um den Server-Code beim
Beenden des Servers/des Streams handelt.

Dazu folgende Anmerkungen:
- Die Liste der Client am besten Rückwärts durchlaufen (Count-1 downto 0), weil wen ein Client seine Verbindung trennt wird er aus der Liste entfernt, ich bin mir nicht sicher ob das in diesem Fall durch das Locken der Liste komplett abgefangen wird.
- Du schreibst Du schickst den Clients eine Nachricht das der Server beendet wird, davon sehe ich in dem Code nichts, dort disconnectest Du die Clients nur, ohne Sie(die Clients) zu informieren, dann kommt es ziemlich sicher bei den Clients zu Exceptions, weil Du denen sozusagen die Verbindung "unterm Arsch" wegziehst. Ich würde den Clients vorher ein Kommando schicken, das der Streams Server um Abmeldung bittet, so das sich die Clients dann von selber beim Server abmelden das ist dann sauberer.

Ein bisschen Client-Code wäre bei der ganzen Sache auch sehr hilfreich

Greetz Data
Der Horizont vieler Menschen ist ein Kreis mit Radius Null, und das nennen sie ihren Standpunkt.
  Mit Zitat antworten Zitat
ByTheTime

Registriert seit: 24. Sep 2011
Ort: Frankfurt
297 Beiträge
 
Delphi XE2 Architect
 
#2

AW: Error Event für TIdTCPClient

  Alt 25. Okt 2012, 17:16
Sorry, das ich mich so lange nicht gemeldet habe, ich wa rim Urlaub und habe in dieser Zeit den Laptop mal ruhen lassen. Aber hier noch mal das Problem und etwas Code:

Ich kann dem Clienten eine Nachricht senden, das er sich beenden soll. Das klappt auch wunderbar, alle Buttons nehmen den Amfangszustand wieder an und die Lampe an meiner WebCam geht aus. Srücke ich jetzt erneut den Start-Button, geht zwar die WebCam an, allerdings bekomme ich kein Bild. Drücke ich dan den Stop-Button, bleibt mein Server-Programm hängen.

Client:

Delphi-Quellcode:
//Adressen, etc. werden schon beim OnCreate gesetzt!

//Erhält Steuerkommandos vom Server

cmdSTARTCAM:
      CamClient.Connect;
    cmdSTOPCAM:
      try
        CamClient.Disconnect;
      except
        ClientSend(Syntax[cmdCAMMSG].Text + #13 + 'Es ist ein Fehler beim trennen der Verbindung aufgetreten.' + #13);
      end;

//Benötiger Code

procedure TfrmMain.CamClientConnected(Sender: TObject);
begin
  fActivated := False;
  fVideoImage := TVideoImage.Create;
  fVideoImage.SetDisplayCanvas(GVideo.Canvas);
  CamExecute;
  TimerList.Events[4].Enabled := TRUE;
end;

procedure TfrmMain.CamClientDisconnected(Sender: TObject);
begin
  TimerList.Events[4].Enabled := False;
  fVideoImage.VideoStop;
  fVideoImage.Free;
  fActivated := TRUE;
  UploadProgress := False;
end;

procedure TfrmMain.CamClientWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
  AWorkCountMax: Int64);
begin
  UploadProgress := TRUE;
end;

procedure TfrmMain.CamClientWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
  UploadProgress := False;
end;

procedure TfrmMain.CamExecute;
var
  DeviceList: TStringList;
begin
  if fActivated then
    Exit;
  fActivated := TRUE;

  DeviceList := TStringList.Create;
  fVideoImage.GetListOfDevices(DeviceList);

  if not DeviceList.Count < 1 then
    fVideoImage.VideoStart(DeviceList[0])
  else
    ClientSend(Syntax[cmdCAMMSG].Text + #13 +
      'Es wurde kein Gerät gefunden!' + #13);
end;

procedure TfrmMain.TimerListEvents4Timer(Sender: TObject);
begin
  if CamClient.Connected then
    if UploadProgress = False then
      CamSend(GVideo.Picture.Bitmap); //Image mit Bild der WebCam
end;

procedure TfrmMain.CamSend(Pic: TBitmap);
var
  MStream: TMemoryStream;
begin
  MStream := TMemoryStream.Create;

  try
    Pic.SaveToStream(MStream);
    MStream.Position := 0;
    try
      CamClient.Socket.Write(MStream, 0, TRUE);
    except
    end;
  finally
    MStream.Free;
  end;
end;
Server:

Delphi-Quellcode:
procedure TfrmCam.CamStop;
begin
  BtnStop.Enabled := false;

  frmMain.ClientSend(Syntax[cmdSTOPCAM].Text + #13);

  delay(500); //Sichergehen, dass das Kommando "durch die Leitung" ist

  CamServer.Active := false;

  RVideo.Picture := BImage.Picture; //Das Bild einer WebCam aus einem "Backup"-Image in das VideoFenster laden
  BtnStart.Enabled := true;
end;

procedure TfrmCam.BtnStartClick(Sender: TObject);
begin
  frmCam.CamServer.Active := true;
  frmMain.ClientSend(Syntax[cmdSTARTCAM].Text + #13);
  BtnStart.Enabled := false;
  BtnStop.Enabled := true;
end;

procedure TfrmCam.BtnStopClick(Sender: TObject);
begin
  CamStop;
end;

procedure TfrmCam.CamServerExecute(AContext: TIdContext);
var
  FStream: TMemoryStream;
begin
  FStream := TMemoryStream.Create;

  try
    AContext.Connection.Socket.ReadStream(FStream);
  finally
    try
      FStream.Position := 0;
      RVideo.Picture.Bitmap.LoadFromStream(FStream);
    finally
      FStream.Free;
    end;
  end;
end;
Lukas
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz