Solved

buffering algorithm

Posted on 2013-12-06
2
410 Views
Last Modified: 2013-12-07
Hi Experts,
I have been struggling for days now how to solve this problem  and couldn't get it right.
Here is the problem:
I receive startPlay command | stopPlay command from the User Interface layer
every command contains a code so e.g.
at 10.33 I receive startPlay (#1)
after 100 ms I receive stopPlay()
I calculate the duration = diff between start time and stop time and send that to network using some protocol.
Then I receive second command and third command etc...
in order to have those commands working at the network side, the duration should be at least 85 ms and the spacing between command e.g command1 and command2 needs to be 45 ms.
There is some delay at the UI layer ( that I cannot control), so sometimes I receive the start command and stop command too short (less than 85 ms), sometimes the gap between command1 and command 2 is less than 45 sec.
I tried to write a buffering algorithm to solve that delay so I can raise the duration to 85 ms if it is less than that and same for the time between stopping first command and starting  the next one.
As of yet I could n't get it working right and came here to seek your advice how to approach this problem.
I thought about having two queues one for the start command and one for the stop command
and a Timer when it kicks check the first queue and run the command then after some time check the second queue and run the stop command but I'm still not clear how to solve it right.
I'm pretty sure this kind of problems was already solved.
0
Comment
Question by:bachra04
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
2 Comments
 
LVL 27

Accepted Solution

by:
dpearson earned 500 total points
ID: 39703899
Something like this might do it for you?

private ExecutorService m_Executor = Executors.newFixedThreadPool(1) ;

// For a start
m_Executor.execute(new Runnable() {			
	public void run() {
              long startTime = System.currentTimeMillis() ;
              startPlay() ;
              long elapsed = System.currentTimeMillis() - startTime ;
              long timeToSleepMs = Math.Max(85-elapsed, 0) ;
              sleep(timeToSleepMs) ;
	}
}) ;

// For a stop
m_Executor.execute(new Runnable() {			
	public void run() {
            stopPlay() ;
	}
}) ;

Open in new window


The idea is to handle the start and stops on a separate thread.  So you can add a sleep() into the start logic making sure the start call takes at least 85 ms.
As the stop is executed on the same thread, it will wait for the first sleep to finish before executing.

However, your thread can continue to receive these and add them to the executor as quickly as you like - they'll just build up and execute in order for you.  So you don't block the UI as it calls to you.

Any help?

Doug
0
 
LVL 2

Author Closing Comment

by:bachra04
ID: 39703947
Now I just need to code it in C/C++ with pthread.
0

Featured Post

Enroll in May's Course of the Month

May’s Course of the Month is now available! Experts Exchange’s Premium Members and Team Accounts have access to a complimentary course each month as part of their membership—an extra way to increase training and boost professional development.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
hashmap order 17 63
How to increment counter variables in ANSI  C (Not C# or C++). 9 73
Read CLOB data from Oracle using JAVA 3 43
COM server issue 2 28
This is a short and sweet, but (hopefully) to the point article. There seems to be some fundamental misunderstanding about the function prototype for the "main" function in C and C++, more specifically what type this function should return. I see so…
Go is an acronym of golang, is a programming language developed Google in 2007. Go is a new language that is mostly in the C family, with significant input from Pascal/Modula/Oberon family. Hence Go arisen as low-level language with fast compilation…
This tutorial covers a practical example of lazy loading technique and early loading technique in a Singleton Design Pattern.
This tutorial explains how to use the VisualVM tool for the Java platform application. This video goes into detail on the Threads, Sampler, and Profiler tabs.
Suggested Courses

739 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question