I agree with Scott.
busy-loop waiting for tick count implementation.
I have an application where I would like to send UDP frames at a fixed
rate. (for example, 200 byte frames at 50 frames per second.)
But, using the example above, I may only get 320 frames sent in 10
seconds instead of the 500 I would expect.
I've put GetTickCount()s around the sendto() function to see if that
was taking longer than I would expect, but it always says 0 ms.
The code I'm using to transmit the frames is below. I'd love to hear
any suggestions.
Thanks,
PaulH
//
// create an empty buffer to pad the frames to the appropriate
size
//
std::vector< char > buffer( 200 );
//
// Throw unicast frames at the given rate & size to the DUT
//
int totalFrames = static_cast< int >( frames_per_second *
runtime / 1000.0f );
DWORD dwStartTick = GetTickCount();
int err = 0;
const char *pBuf = &buffer.front();
const int bufSize = static_cast< int >( buffer.size() );
//
// Create a timer to send frames at a given rate
//
HANDLE hTimer = ::CreateWaitableTimer( NULL, FALSE,
NULL );
LARGE_INTEGER transmitTime = { 0 };
transmitTime.QuadPart = static_cast< LONGLONG >(
-( 10000000.0f / static_cast< float
( frames_per_second ) ) );
const int period = 1000 / frames_per_second;
::SetWaitableTimer( hTimer, &transmitTime, period, NULL, NULL,
0 );
//
// transmit the test frames
//
while( ( err = sendto( dutSocket,
pBuf,
bufSize,
0,
reinterpret_cast< SOCKADDR* >( DUTAddr-
ai_addr ),
DUTAddr->ai_addrlen ) ) != SOCKET_ERROR &&
( GetTickCount() - dwStartTick ) < static_cast< UINT
( runtime ) )
{
sentFrames++;
::WaitForSingleObject( hTimer, period );
}