Seite 1 von 2

Mein Network Video exchange Tool

Verfasst: 08.05.2008 21:16
von Joel
Hallo,

Ich möchte eine Datei senden. Diese Datei wird immer in kleine 600 KB Packete aufgeteilt.

Jetzt möchte ich eine Fortschrittanzeige machen, in der man immer erkennt wie weit der Prozess mit dem Senden der Datei ist.

Hier ist der Code:

Code: Alles auswählen

If OpenWindow(0, 216, 0, 394, 314, "Test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(0))
      StringGadget(1, 10, 32, 250, 25, "")
      ButtonGadget(2, 270, 30, 110, 27, "Durchsuchen")
      TextGadget(3, 10, 5, 250, 15, "Bitte die Datei auswählen, die gesendet werden soll:")
      ButtonGadget(4, 130, 270, 140, 40, "Senden!!!", #PB_Button_Default)
      ProgressBarGadget(5, 10, 140, 370, 50, 0, 100)
      TextGadget(6, 110, 110, 160, 15, "Fortschritt des sendens der Datei:")
      EndIf
       Repeat
    EventID = WaitWindowEvent()
    
    If EventID = #PB_Event_Gadget

      Select EventGadget()
        Case 4

; Hier muss was ergänzt werden
        SetGadgetState(5, Status)
         EndSelect
  EndIf
Until lol = 4
EndIf 
Da wo: ;Hier muss was ergänzt werden steht muss irgentwas ergänzt werden, dass dem Befehl SetGadgetState sagt, wie viele Balken es machen muss.

Habt ihr eine Idee wie man das ergänzen kann????

Mein Programm gibt außerdem 2 Werte an!!!

Der Wert "Max" gibt immer die Anzahl aller zu sendenden Daten an.
Der Wert "Aktuell" gibt immer an, welche Datei als letztes gesendet wurde, also z.B. 3 oder 4.

Verfasst: 08.05.2008 22:03
von BlueHoschi
Hallo Joel,

Du weißt ja sicher wie groß die Datei ist die Du sendest, also mußt Du im Prinzip nur ausrechnen wieviel Du schon gesendet hast und das dann in Deine 0-100 Unterteilung umrechnen.

Einfacher Dreisatz, z.B. bei einer 4 MB großen Datei und 1800 kB die schon übertragen sind:
100 (Prozent oder ganze Teile des ProgressBars) geteilt durch 4 MB
mal 1800. Dann hast Du´s.

Also SetGadgetState(5,100/(4*1024) * 1800)

Natürlich mußt Du das ganze in Variablen verpacken z.B. so:
a.f = Dateigröße der zu versendenden Datei
b.f = Gesamtgröße der schon versendeten Packete

SetGadgetState(5,100/a.f*b.f)

Da ich mit ProcessBar an sich noch keine Erfahrung habe, kann ich nicht sagen ob es mit Fließkommazahlen funktioniert, aber bislang klappte es mit PB bei allem anderen. Fließkommazahlen, um die Zahl hundert mit einer um ein vielfaches höheren zu teilen sonst wird es sehr ungenau.
Ansonsten mußt Du es eben nochmal zwischenspeichern und auf z.B. long übertragen.
Falls es nicht klappt dann frag nochmal.

Gruß BlueHoSchi

//edit
Habs gerade probiert, es geht mit .f
Hoffe ich habe Deine Frage richtig verstanden

Verfasst: 09.05.2008 17:05
von Joel
Ok, vielen Dank, es klappt.

Ich habe aber noch ein Problem.

Nach dem Klick auf "Senden!" wird Case 4 aufgerufen und der Rest des rechnens spielt sich in Case 4 ab.

Wenn ich kein anderes Fenster bewege oder kein anderes Fenster in den Vordergrund stelle, läuft alles wie geplant;wenn ich das aber nicht mache wird das Fenster weiß und es zeigt nichtmehr den Aktuellen Status der Statusanzeige an, sondern bleibt weiß.

Was kann ich dagegen tun???

Kann ich das Fenster vielleicht immer zwischendrin mit einer Extra Procedure oder in der Procedure Aktualisieren???

Verfasst: 09.05.2008 17:24
von a14xerus
die "aktualisiereung" des fenster geschieht durch waitwindowevent() oder windowevent()

da das senden bei case 4 stattfindet und erst danach die event-schleife weiter abgearbeitet wird, werden keine events (wie zb neuzeichnen des fenster)

also lagerst du das senden am besten in einen thread aus (thread => parralel zum hauptprogramm ablaufender code)

also:

das ganze senden in eine procedure stecken,
diese braucht einen parameter, auch wenn du diesen nicht benutzt.

procedure mit createthread(@procedure,0) aufrufen und fertig;)

am besten in projektoptionen threadsafe anklicken

Suche auch im forum mal nach "Thread" oder ähnlihcem sowieso "fortschrittsbalken"
gab schon öfter solche fragen

Verfasst: 09.05.2008 18:30
von Brügge
ich hätte da auch mal noch ne frage...

wie ist das, wenn man eine Datei die größer ist (z.B. ein Film) nur halb rüberzieht, existiert die Datei dann nur bis zur hälfe, und was passiert, wenn man nochmal ReceiveNetworkFile(Verbindung, DateiName$) auf der geichen Datei anwendet, macht der dann an der gleichen Stelle weiter, oder Läd er den Film dann komplet neu?

THX!

Verfasst: 09.05.2008 18:35
von a14xerus
machs am betsen selber mit send data usw

Verfasst: 09.05.2008 19:48
von Scarabol

Verfasst: 09.05.2008 21:03
von Joel
Ok, habe ich gemacht, klappt soweit.

Code: Alles auswählen

TextGadget(6, 110, 110, 160, 15, "Fortschritt des sendens der Datei:")
      EndIf
       Repeat
       
       
       
    EventID = WaitWindowEvent() 
    Debug Rechnerin
    If Rechnerin = 430
       SetGadgetState(5, Hoch.f)
       Rechnerin = 10
       EndIf 
       
    If EventID = #PB_Event_Gadget

      Select EventGadget()
Immer wenn Rechnerin = 430 ist, dann muss der Status geändert werden. Das Problem ist, nur wenn ich mit der Maus über das Fenster fahre wird If Rechnerin = 430 abgefragt. Kann ich das irgentwie ändern???

Wenn uns nichts einfällt müsste ich die Maus immer mal schnell mit der Mouse-Lib über das Fenster fahren lassen :mrgreen:

Verfasst: 09.05.2008 22:50
von tobe
hi Joel,

mit deinem codeschnipsel kann man jetzt eigentlich nicht viel anfangen ;)
aber probier es doch mal mit

Code: Alles auswählen

EventID = WaitWindowEvent(100) 
dann wird ca alle 100ms die abfrage durchlaufen und bei jedem anderen event der das fenster erreicht (zb mausbewegung).

Verfasst: 10.05.2008 18:57
von Joel
Ok, mein Programm ist soweit fertig. Ich weiß jedoch noch nicht ob es funktioniert, weil ich es nur auf meinem eigenen PC ausprobiert habe.

Ich Poste den Client und den Server hier einfach mal und hoffe ihr vielleicht Zeit habt das zu testen (also Client und Server auf 2 verschiedenen PCs, am besten nicht in einem Netzwerk) Danke Schonmal im Voraus.

Wenn ihr noch etwas findet, das an meinem Programm verbessert werden sollte oder was noch hinzugefügt werden sollte etc. dann dürft ihr das hier auch sehr gerne Posten.

Manche Brechnungen und anderes habe ich sehr Kompliziert gemacht, wenn ihr eine Möglichkeit kennt wie man das kurzer schreiben könnte, dann bitte auch hier Posten

Vielen Dank im Voraus, :allright:

Hier der Server:

Code: Alles auswählen

Procedure Zusammen()
CreateFile(3,"C:\test.JPG")
Zahl= 0
For x = 1 To 999999
If ReadFile(1, "C:\1\"+Str(x)+".JPG") = 0
Goto Weiter_1:
EndIf 
Zahl+1
Next

Weiter_1:

For q = 1 To Zahl
OpenFile(2,"C:\1\"+Str(q)+".JPG")
Size=FileSize("C:\1\"+Str(q)+".JPG")
For a = 1 To Size
WriteByte(3,ReadByte(2)) 
Next 
 Next 
 
CloseFile(2)
CloseFile(3)

EndProcedure 
v = 0

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

CreateDirectory("C:\1\")

Port = 6705
*Buffer = AllocateMemory(1000)

If CreateNetworkServer(0, Port)

  ;MessageRequester("PureBasic - Server", "Server created (Port "+Str(Port)+").", 0)
  
  Repeat
      
     Delay(20)
      
    SEvent = NetworkServerEvent()
  
    If SEvent
    
      ClientID = EventClient()
  
      Select SEvent
      
        ;Case 1
          ;MessageRequester("PureBasic - Server", "A new client has connected !", 0)
  
        Case 2
        Datenpuffer.s = Space(4) 
  ReceiveNetworkData(ClientID, @Datenpuffer, 4) 

  
  If Datenpuffer = "zusa"
  Zusammen()
  SendNetworkString(ClientID, "endu")
  EndIf   
  
        Case 3
If ReadFile(7, "C:\test.JPG") <> 0
ReceiveNetworkFile(ClientID, "C:\Endungg.txt")
OpenFile(10, "C:\Endungg.txt")
EndungFile$ = ReadString(10, 0)
CopyFile("C:\test.JPG","C:\Datei."+EndungFile$)
CloseFile(10)
CloseFile(7)
DeleteFile("C:\test.JPG")
DeleteFile("C:\Endung.txt")
DeleteFile("C:\Endungg.txt")
DeleteDirectory("C:\1\", "*.*", 0)
DeleteDirectory("C:\Split\", "*.*", 0)
CloseNetworkServer(0)
End 
EndIf 
        v+1
        ReceiveNetworkFile(ClientID, "C:\1\"+Str(v)+".JPG")
        SendNetworkString(ClientID, "näch")
     
        Case 4
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connexion...", 0)
          Quit = 1
    
      EndSelect
    EndIf
    
  Until Quit = 1 
  
  MessageRequester("PureBasic - Server", "Click to quit the server.", 0)
  
  CloseNetworkServer(0)
Else
  MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
End  



Und hier der Client: (bei OpenNetworkConnection() bitte das richtige eintragen)

Code: Alles auswählen

Colori+1
Global S.s
Global Fertig
Global Rechnerin
Global Ente
Global ende
Global Los
Global ServerID
Global ConnectionID
Global GG.f
Global S
Global S$
Global Max.f
Global Status.f
Global Wert.f 
Global Akt.f
Global Hoch.f
Akt.f = 0
Rechnerin = 0
Colori = 0



Procedure Splitten()
P.s="C:\Split\" 
Size= FileSize(S$) 
Size1 = FileSize(S$)
Byt = 600000

CreateDirectory(P) 

If OpenFile(0,S$)


For x=1 To Size/Byt+1

  CreateFile(1,P+Str(x)+".JPG") 
  For i=1 To Byt
  
  Size1-1

    If Size1 = 0
    WriteByte(1,ReadByte(0)) 
 CloseFile(1)
 CloseFile(0)
 Goto Weiter_1:
  EndIf 
     WriteByte(1,ReadByte(0)) 
  Next 
  CloseFile(1) 
Next 
CloseFile(0) 
EndIf
Weiter_1:
EndProcedure 


Procedure Daten()
Delay(5000)
Max.f= 0
For x = 1 To 999999
If ReadFile(1, "C:\Split\"+Str(x)+".JPG") = 0
Goto Weiter_2:
EndIf 
Max.f+1
Next

Weiter_2:
Ente = 45
EndProcedure 



Procedure Main()
If InitNetwork() = 0 
  MessageRequester("Error", "Can't initialize the network !", 0) 
  End 
EndIf 

Port = 6705

;-Schleife zur Verbindungs-Herstellung
  Repeat 
  ConnectionID = OpenNetworkConnection("127.0.0.1", Port) 
If ConnectionID 
EndIf 
Delay(100) 
Until ConnectionID <> 0 
ende = 45
  Splitten()
  Daten() 
  Aktuell = 0
  For m = 1 To Max.f
  SendNetworkFile(ConnectionID,"C:\Split\"+Str(m)+".JPG" )
  Los = 55
   Next 
  SendNetworkString(ConnectionID, "zusa")
 EndProcedure 
 
 
 
 Procedure warten()
 Repeat 

Delay(200)
    
    ServerID = NetworkClientEvent(ConnectionID) 
    Select ServerID
 
  Case 2 

  Datenpuffer.s = Space(4) 
  ReceiveNetworkData(ConnectionID, @Datenpuffer, 4) 
  
  If Datenpuffer = "endu"
    Endung$ = GetExtensionPart(S$)
    CreateFile(6, "C:\Endung.txt")
    WriteString(6, Endung$, 0)
    CloseFile(6)
SendNetworkFile(ConnectionID, "C:\Endung.txt")
Fertig = 45
    Delay(1000)
    CloseNetworkConnection(ConnectionID)
    End 
    
  EndIf
  

  
  If Datenpuffer = "näch"
  Akt.f+1
  
  EndIf 
  
  
  EndSelect 
  
 Until Quit = 1


EndProcedure 


Procedure Rechner()
 MainThread = CreateThread(@Main(), 400)
 Repeat
       Delay(100)
       Until ende = 45
       wartenThread = CreateThread(@warten(), 500)
       Repeat
       Delay(10)
       Until Ente = 45
       
       Wert.f=100/Max.f
       GG.f = 0
       Repeat 
       GG.f+1
       Repeat
       Delay(20)
       Until Akt.f = GG.f
       Rechnerin = 430
       Hoch.f = Akt.f*Wert.f   
       Delay(100)
       Until Hallo = 433
EndProcedure 





If OpenWindow(0, 216, 0, 399, 314, "Datei-Senden",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(0))
      StringGadget(1, 10, 32, 250, 25, "")
      ButtonGadget(2, 270, 30, 110, 27, "Durchsuchen")
      TextGadget(3, 10, 5, 250, 15, "Bitte die Datei auswählen, die gesendet werden soll:")
      ButtonGadget(4, 130, 270, 140, 40, "Senden!!!", #PB_Button_Default | #PB_Button_Toggle)
      ProgressBarGadget(5, 10, 140, 370, 50, 0, 100)
      TextGadget(6, 110, 110, 160, 15, "Fortschritt des sendens der Datei:")
      EndIf
       Repeat
       
       
       
    EventID = WaitWindowEvent(100) 
    If Rechnerin = 430
   ; If Rechnerin = 430
       SetGadgetState(5, Hoch.f)
       Rechnerin = 10
       EndIf 
       
             
       
       
    If EventID = #PB_Event_Gadget

      Select EventGadget()
      
      
      Case 2

      S$ = OpenFileRequester("Datei auswählen die geschickt werden soll", "C:\Downloads\Software\","*.*", 0, 0)
      SetGadgetText(1, S$)


      
        Case 4
        DisableGadget(4, 1)
        RechnerThread = CreateThread(@Rechner(), 400)
        TextGadget(9, 0, 210, 400, 15, "Die Datei wird Verarbeitet, dannach kann man den Fortschritt des sendens verfolgen")
        SetGadgetColor(9,#PB_Gadget_FrontColor, $0000FF)

         EndSelect
  EndIf

Until lol = 4
EndIf