Warning, /frameworks/threadweaver/docs/use-cases.md is written in an unsupported language. File is not indexed.

0001 Use Cases         {#usecases}
0002 =========
0003 
0004 ThreadWeaver provides a solution to a number (but not all)
0005 multithreading problems. Let's have a look:
0006 
0007 - How do you implement a single operation that takes a lot of CPU power, but is
0008   hard to handle in chunks (Example: scale an image) when you want your GUI to
0009   remain responsive? Encapsulate the operation in a class object derived from
0010   Job instead of a method and put it in the static instance (Weaver::instance).
0011   Connect to the Job's done() signal to receive a notification when it is
0012   completed.
0013 - How do you implement a CPU intensive operation while time-critical operations
0014   are executed (load and decode an MP3 while another one is fed to the audio
0015   device): Implement both the file loading operation and the play operation in
0016   a job and queue both at the same time. There is also a synchronous sleep
0017   method in the Job class if a job needs to be delayed for a number of
0018   milliseconds after it is taken over by a thread.
0019 - How do you implement many small operations where the cost of each individual
0020   one is hard to estimate (loading two hundred icons from an NFS drive): Create
0021   a common or a number of specialized job classes. Queue all of them. Either
0022   connect to the individual done signal to process every item when it has been
0023   finished or connect to Weaver::jobsDone() to receive a notification when all
0024   of the jobs are done.
0025 - How do you implement an operation with complex control flow and dependencies
0026   in the execution order (load, parse and display an HTML document with
0027   embedded media): Create jobs for the individual steps you need to perform.
0028   Try to split the whole operation in as many independent, parallelizable parts
0029   as possible. Now declare the execution dependencies. A job will only be
0030   executed when all jobs it depends on are finished. This way every individual
0031   operation will be executed as soon as it becomes possible. Connect to the
0032   final jobs done() signal to be notified when all parts of the whole
0033   operations have been executed. If necessary (if there is more than one final
0034   object), create a dummy job object that depends on all of them to have one
0035   central end point of execution.
0036 
0037 As you can see, ThreadWeaver can provide solutions for simple, but
0038 also for complex cases. For an example on how job dependencies can be
0039 modeled and used to create elegant, streamlined solutions for control
0040 flow modeling, see the Simple Multithreaded Image Viewer (SMIV) example
0041 in the Tests directory.
0042 
0043 ThreadWeaver focuses on operations that can be implemented in
0044 Jobs. To create solutions where a thread is supposed to constantly run
0045 to perform an ongoing operation that, for example, spans the whole
0046 application live, it has to be verified that it is the right
0047 approach. It is possible to add very long or neverending operations to
0048 the queue, but it will constantly bind a thread to that operation. It
0049 might still make sense to use ThreadWeaver, as the creation, handling
0050 and destruction of the threads is already taken care of, but the minimum
0051 inventory size (thread count) should be increased accordingly to provide
0052 for enough threads to process the other jobs.
0053