Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#1

"Aggressiver" downloaden?

  Alt 5. Aug 2012, 15:10
Schmucken Sonntag wünsch ich!

Ich habe ein Programm zur Archivierung von Sicherheitskamerabildern gebaut, bin aber etwas unzufrieden mit meinem Download der Einzelbilder. Technisch sieht das ganze so aus, dass es 17 Kameras sind, die alle ihre Bilder auf einen Webserver packen. Das aktuelle Bild ist also pro Kamera je unter einer URL zu finden. Ich habe jetzt mit C# (war so gewünscht) einen Client gebaut, der in je einem Thread pro Kamera die Bilder abruft, und zunächst mit Datum auf die Platte wirft (später soll mal ein Video daraus werden).

Das Problem ist: Wenn ich die zu den Kameras gehörende Weblösung benutze, bekomme ich deutlich öfter ein neues Bild als mit meiner Lösung. Irgend etwas bremst mich, ich weiss aber nicht was. Selbst wenn ich Weblösung und mein Programm auf ein und der selben Kiste gleichzeitig laufen habe, ist der Webclient erheblich flotter am Werke.
Das Snippet welches bei mir den Download macht: (Dies ist mein Thread-Loop, von dem einer für jede Cam läuft.)
Code:
private void DownloadCycle()
{
   while (!Terminated)
   {
      try
      {
         if (!Paused)
         {
            if (WC == null)
            {
               WC = new WebClientTimeOut();
               WC.TimeOut = 2000;
            }
            bool picOK = true;
            byte[] tmp = new byte[0];
            try {tmp = WC.DownloadData(URL);} catch {picOK = false;}
            if (picOK)
            {
               Image tmpImg = Image.FromStream(new MemoryStream(tmp));
               DateTime newDate = DateTime.Now.Date;
               if (newDate > Today)
               {
                  Today = newDate;
                  CurrentDir = BaseFolder+Today.ToString("yyyyMMdd")+"\\";
                  Directory.CreateDirectory(CurrentDir);
               }
               tmpImg.Save(CurrentDir + DateTime.Now.ToString("HHmmss-fff")+".jpg");
            }
         }
      }
      catch
      {} // Ja böse, aber ich will einfach nur, dass der Thread weiter rennt, egal was passiert =)
   }
}
Die Klasse WebClientTimeOut ist ein aufgebohrter WebClient, da diese sonst den Timeout des WebRequest nicht weiterreicht:
Code:
public class WebClientTimeOut : WebClient
{
   protected override WebRequest GetWebRequest(Uri address)
   {
   WebRequest webRequest = base.GetWebRequest(address);
   webRequest.Timeout = TimeOut;
   return webRequest;
   }
   public int TimeOut { set; get; }
}
Einen Timeout < +inf brauche ich, da ab und an die Requests arg lange dauern. Zwar selten, aber kam schon vor.


Teilweise bekomme ich nur 2-3 Bilder pro Minute, während der Webclient sekündlich ein neues Bild zeigt. Wie könnte ich das auch schaffen?
Besten Dank im Voraus, und schönes Rest-Wochenende noch!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat