> did you look at my code below? Not really. Each time I see a TTimer triggered every 100 mSec (or any very short time period), I know this will cause CPU problem. And bandwidth limitation defenitely doesn't require a so short period of time. What is useful, regarding bandwidth limitation - is to have bandwidth limited on a reasonable time period (a few second IMO).
It is likely that each time you resume the socket, winsock send a FD_WRITE message to get more data to send. That's why the CPU is used there. -- [EMAIL PROTECTED] http://www.overbyte.be ----- Original Message ----- From: "Fastream Technologies" <[EMAIL PROTECTED]> To: "ICS support mailing" <twsocket@elists.org> Sent: Sunday, January 29, 2006 10:04 AM Subject: Re: [twsocket] THttpConnection throttling problem with timer > But it does not work that way! Maybe my logic is a bit different, did you > look at my code below? > > Regards, > > SZ > > ----- Original Message ----- > From: "Francois PIETTE" <[EMAIL PROTECTED]> > To: "ICS support mailing" <twsocket@elists.org> > Sent: Sunday, January 29, 2006 10:50 AM > Subject: Re: [twsocket] THttpConnection throttling problem with timer > > >> 100 mSec is way too short. Use 2000 mSec or more. >> -- >> [EMAIL PROTECTED] >> http://www.overbyte.be >> >> ----- Original Message ----- >> From: "Fastream Technologies" <[EMAIL PROTECTED]> >> To: "ICS support mailing" <twsocket@elists.org> >> Sent: Sunday, January 29, 2006 8:41 AM >> Subject: [twsocket] THttpConnection throttling problem with timer >> >> >>> Hello, >>> >>> I implemented -almost- the same mechanism as THttpCli as Francois said. >>> The >>> timer runs per every 100ms and the code is below: >>> >>> void __fastcall httpServerThread::TimerResume(TObject *Sender) >>> { >>> if(resumeTimerTick % (10 * 8) == 0) >>> { >>> serverPermissions->resetConsumedSpeedLimit(); >>> >>> httpServerClientClass *bufferClient; >>> >>> for(int i = 0; i < HTTPServer->ClientCount; ++i) >>> { >>> bufferClient = >>> (httpServerClientClass*)HTTPServer->Client[i]; >>> >>> if(!bufferClient->bandwidthPermissions) >>> continue; >>> >>> if(bufferClient->paused) >>> { >>> bufferClient->paused = false; >>> >>> PostThreadMessage(bufferClient->affinityThread->ThreadID, >>> WM_RESUME_CLIENT, (WPARAM)bufferClient, 0); >>> } >>> } >>> } >>> else >>> { >>> httpServerClientClass *bufferClient; >>> >>> for(int i = 0; i < HTTPServer->ClientCount; ++i) >>> { >>> bufferClient = >>> (httpServerClientClass*)HTTPServer->Client[i]; >>> >>> if(!bufferClient->bandwidthPermissions) >>> continue; >>> >>> if(!bufferClient->paused) >>> { >>> >>> if(bufferClient->bandwidthPermissions->isSpeedLimitReached()) >>> { >>> bufferClient->paused = true; >>> //bufferClient->Pause(); >>> >>> >>> PostThreadMessage(bufferClient->affinityThread->ThreadID, >>> WM_PAUSE_CLIENT, (WPARAM)bufferClient, 0); >>> } >>> } >>> >>> >>> PostThreadMessage(bufferClient->affinityThread->ThreadID, >>> WM_CLIENT_TIMER, (WPARAM)bufferClient, 0); >>> } >>> } >>> >>> ++resumeTimerTick; >>> } >>> //--------------------------------------------------------------------------- >>> >>> >>> When the throttling is enabled, the CPU usage goes to 100%. Aqtime code >>> profiler tells me that the below function is the reason of it: >>> >>> procedure TCustomWSocket.TryToSend; >>> var >>> oBuffer : TBuffer; >>> Len : Integer; >>> Count : Integer; >>> Data : Pointer; >>> LastError : Integer; >>> { p : PChar;23/12/01} >>> bMore : Boolean; >>> // Hit Count : 29731 >>> // Time : 19,86 >>> // Time with Children : 22,74 >>> begin >>> if (FHSocket = INVALID_SOCKET) or { No more >>> t } >>> (FBufList.Count = 0) { Nothing to >>> } >>> {or (bMoreFlag and (nMoreCnt >= nMoreMax))23/12/01} { Waiting more >>> signal } >>> then begin >>> bAllSent := True; >>> exit; >>> end; >>> >>> bMore := TRUE; >>> while bMore do begin >>> oBuffer := FBufList.First; >>> Data := oBuffer.Peek(Len); >>> if Len <= 0 then begin >>> { Buffer is empty } >>> if FBufList.Count <= 1 then begin >>> { Every thing has been sent } >>> bAllSent := TRUE; >>> bMore := FALSE; >>> end >>> else begin >>> oBuffer.Free; >>> FBufList.Delete(0); >>> FBufList.Pack; >>> end; >>> end >>> else begin >>> Count := RealSend(Data, Len); >>> if Count > 0 then begin >>> Dec(FBufferedByteCount, Count); { V5.20 } >>> if FBufferedByteCount < 0 then >>> FBufferedByteCount := 0; >>> end; >>> if Count = 0 then >>> bMore := FALSE { Closed by remote } >>> else if count = SOCKET_ERROR then begin >>> LastError := WSocket_Synchronized_WSAGetLastError; >>> if (LastError = WSAECONNRESET) or (LastError = >>> WSAENOTSOCK) >>> or >>> (LastError = WSAENOTCONN) or (LastError = WSAEINVAL) >>> or >>> (LastError = WSAECONNABORTED) { 07/05/99 } >>> then begin >>> {$IFDEF DEBUG_OUTPUT} >>> OutputDebugString(Name + ' Winsock.Send failed ' + >>> IntToStr(LastError)); >>> {$ENDIF} >>> FCloseInvoked := TRUE; { 23/07/98 } >>> Close; >>> TriggerSessionClosed(LastError); { 23/07/98 } >>> end >>> else if LastError <> WSAEWOULDBLOCK then begin >>> SocketError('TryToSend failed'); >>> Exit; >>> end; >>> bMore := FALSE; >>> end >>> else begin >>> oBuffer.Remove(Count); >>> if Count < Len then begin >>> { Could not write as much as we wanted. Stop >>> sending } >>> {$IFDEF DELPHI1} >>> { A bug in some Trumpet Winsock implementation break >>> he } >>> { background sending. Jan Tomasek >>> <[EMAIL PROTECTED]> } >>> if not TrumpetCompability then begin >>> {bWrite := FALSE;23/12/01} >>> bMore := FALSE; >>> end; >>> {$ELSE} >>> {bWrite := FALSE;23/12/01} >>> bMore := FALSE; >>> {$ENDIF} >>> end; >>> end; >>> end; >>> end; >>> end; >>> >>> Any idea why the bottle neck is? One interesting problem, the throttling >>> cannot slow it any slower than 2.5 MBps! (local test) When the >>> throttling >>> is >>> shut down, the timer still runs but it is not paused/resumed and the CPU >>> usage is less than 5%. >>> >>> Regards, >>> >>> SZ >>> >>> -- >>> To unsubscribe or change your settings for TWSocket mailing list >>> please goto http://www.elists.org/mailman/listinfo/twsocket >>> Visit our website at http://www.overbyte.be >> >> -- >> To unsubscribe or change your settings for TWSocket mailing list >> please goto http://www.elists.org/mailman/listinfo/twsocket >> Visit our website at http://www.overbyte.be > > -- > To unsubscribe or change your settings for TWSocket mailing list > please goto http://www.elists.org/mailman/listinfo/twsocket > Visit our website at http://www.overbyte.be -- To unsubscribe or change your settings for TWSocket mailing list please goto http://www.elists.org/mailman/listinfo/twsocket Visit our website at http://www.overbyte.be