übertragungsgeschwindigkeit ausrechnen...



  • hi leute!
    ich will die übertragungsgeschw meines filetransfers berechnen....
    empfange da in der schleife die bytes...
    muss ich das irgendwie mit timer messung machen? will relativ genau sein...
    nach dem empfang des ersten paketes timer starten bis das nexte paket kommt?
    wie initialisiere u verwende ich den timer?

    empfangsseite:

    char buffer[1024];
    
    		DWORD bytesReceivedTotal = 0;
    
    		while(bytesReceivedTotal < fileInfo.size)
    		{
    			int bytesReceived = socket.receive(buffer, sizeof(buffer));
    			bytesReceivedTotal += bytesReceived;
    
    			DWORD bytesWritten;
    			WriteFile(fileHandle, buffer, bytesReceived, &bytesWritten, NULL);
    
    			int pos = static_cast<int>(static_cast<float>(bytesReceivedTotal) / fileInfo.size * 100);
    			std::cout << pos << std::endl;
    
    			SendMessage(hProgress, PBM_SETPOS, (WPARAM) pos, 0);
    		}
    


  • Für sowas sollte eigentlich GetTickCount genügen 🙂



  • hi
    ich mach das so im mom:

    #include <ctime>
    
    std::string fileName; // global
    std::stringstream kb_sec; // global
    
    //////////////////// empfangen ////////////////////////
    
    char buffer[1024];
    
    DWORD bytesReceivedTotal = 0;
    
    time_t start, last = 0; 
    start = time(0);
    double kbytes_sec = 0;
    DWORD bytesReceivedLast = 0;
    
    while(bytesReceivedTotal < fileInfo.size)
    {
    	int bytesReceived = socket.receive(buffer, sizeof(buffer));
    	bytesReceivedTotal += bytesReceived;
    
    	if(time(0) - last >= 1) 
    	{
    		kbytes_sec = (double) ((bytesReceivedTotal - bytesReceivedLast) / 1024.0);
    		kb_sec << kbytes_sec;
                    // Hauptfenster neu zeichnen
    		InvalidateRect(hwnd, NULL, TRUE);
    		kb_sec.str ("");
    		last = time(0);
    		bytesReceivedLast = bytesReceivedTotal;
    		std::cout << kbytes_sec << std::endl;
    	}
    
    	DWORD bytesWritten;
    	WriteFile(fileHandle, buffer, bytesReceived, &bytesWritten, NULL);
    
    	int pos = static_cast<int>(static_cast<float>(bytesReceivedTotal) / fileInfo.size * 100);
    	//std::cout << pos << std::endl;
    
    	SendMessage(hProgress, PBM_SETPOS, (WPARAM) pos, 0);
    }
    
    /////////////////// in der Hauptnachrichtenschleife ////////////////////
    
       case WM_PAINT:
          hdc = BeginPaint (hwnd, &ps);
          TextOut (hdc, 0, 0, fileName.c_str(), fileName.length());   // Filename in Hauptfenster schreiben
    	  TextOut (hdc, 100, 50, kb_sec.str().c_str(), kb_sec.str().length());  // Kb_sec in Hauptfenster schreiben
          EndPaint (hwnd, &ps);
          return 0;
    

    irgendwie bekomm ich keine gescheiden werte;-( 200 kommt raus..hmm und in textout wird das a nit gescheid angezeigt....manchmal zeigts ein leeres feld an...was mach ich da falsch??

    cu



  • die methode funzt;-))))
    aber zeigt nur einen genauen wert an wenn ich über 5kb/sec übertrage? wäre nicht besser ein timer der alle 1 sec die berechnungsfunktion aufruft?

    cu



  • Du kannst ja mit SetTimer einen Timer einrichten und dann in WM_TIMER mit GetTickCount die tatsächlich vergangene Zeit ermitteln und dann die Übertragungsgeschwindigkeit daraus ermitteln. Diese dann z.B. in einem Static-Control ausgeben oder direkt ins Hauptfenster schreiben (InvalidateRect und dann in WM_PAINT zeichnen)



  • flenders schrieb:

    Du kannst ja mit SetTimer einen Timer einrichten und dann in WM_TIMER mit GetTickCount die tatsächlich vergangene Zeit ermitteln und dann die Übertragungsgeschwindigkeit daraus ermitteln. Diese dann z.B. in einem Static-Control ausgeben oder direkt ins Hauptfenster schreiben (InvalidateRect und dann in WM_PAINT zeichnen)

    also so:

    SetTimer(hwnd,             // handle to main window 
        IDT_TIMER1,            // timer identifier 
        1000,                  // 1-second interval 
        (TIMERPROC) NULL);     // no timer callback
    

    settimer am besten in die hauptnachrichtenschleife rein tun?
    was ist timer callback??? wie kann ich dem timer sagn: ruf ein unterprogramm zb.: void kb_sec_berechnen() aus?

    cu



  • Entweder du gibts diese Funktion als timer callback an, oder du machst das Ganze einfach in WM_TIMER. Den Timer erzeugst du am besten in WM_CREATE - würde ich mal sagen 🙂



  • flenders schrieb:

    Entweder du gibts diese Funktion als timer callback an, oder du machst das Ganze einfach in WM_TIMER. Den Timer erzeugst du am besten in WM_CREATE - würde ich mal sagen 🙂

    SetTimer(hwnd,             // handle to main window 
        IDT_TIMER1,            // timer identifier 
        1000,                  // 1-second interval 
        (TIMERPROC) TimerProcedure);     // no timer callback
    

    der timer läuft schon, mit so ner Callback Funktion!;-) was muss ich tun damit ihn das WM_Time verwenden kann? kann man den timer irgendwie starten bzw stoppen? cu



  • coder1 schrieb:

    was muss ich tun damit ihn das WM_Time verwenden kann?

    Also entweder du bearbeitest WM_TIMER, oder du machst das Ganze eben über die Calback-Funktion.

    coder1 schrieb:

    kann man den timer irgendwie starten bzw stoppen?

    Zum Stoppen musst du einfach KillTimer mit dem Fensterhandle und der ID von SerTimer aufrufen. 🙂
    Zum erneuten Starten, dann einfach wieder SetTimer 😉



  • flenders schrieb:

    Also entweder du bearbeitest WM_TIMER, oder du machst das Ganze eben über die Calback-Funktion.

    ich setz einfach den 4ten Paramenter (TIMERPROC) NULL
    u erstelle WM_TIMER in der Hauptnachrichtenschleife?

    thx+cu



  • coder1 schrieb:

    flenders schrieb:

    Also entweder du bearbeitest WM_TIMER, oder du machst das Ganze eben über die Calback-Funktion.

    ich setz einfach den 4ten Paramenter (TIMERPROC) NULL
    u erstelle WM_TIMER in der Hauptnachrichtenschleife?

    Ja.

    Wenn du das einfach ausprobiert hättest, hätte sich deine Frage erübrigt. 🙄
    wmfrs


Anmelden zum Antworten