[fpc-pascal] Use sleep in thread

A. Fortuny aforsprl at gmail.com
Thu Mar 5 11:49:16 CET 2015

Le 25/02/2015 15:41, Xiangrong Fang a écrit :
> Hi All,
> Can I use Sleep() in a thread to give up cpu time to other threads 
> running at the same time, so as to adjust the relative "niceness" of a 
> group of workers working on the same subject (in which each thread 
> take part of the whole task).
> Thanks!
> Xiangrong
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
Coming back to the initial message, I've had to solve a similar problem 
a year ago. A bunch of threads had to do do some job each one related to 
a database. Jobs to do were coming from the main thread (a service) and 
some results and messages where held and processed by the same main 
thread. The main problem was that all threads had to take care from 
incoming messages.

For tthese reasons I implemented the threads with a loop where the last 
instruction was a WaitForMultipleObjects. The events where hosted and 
set in the main thread which fired the events when something was to be 
done by the relevant thread. This way, when the thread had nothning to 
do, the WaitFor... passed the control to the kernel and entered a sleep 
state. But if an incoming job was posted, the event fired did awake the 
corresponding thread. Some other threads did not wait for any external 
job, so the WaitFor... was replaced by a simple Sleep. This helped me to 
implement an internal thread safe message queue. Another problem solved 
was a front end program using Indy and TCP/IP listener using non 
blocking sockets, to be reactive to more than 20 active TCP/IP clients 
sending messages for about 10 in a second for each client. The front end 
program managed all this incoming traffic showing that all client 
threads were working almost "at the same time". Using events the main 
program was able to send user commands to the "sleepeng" threads and 
seeing them be executed at once.

So using either Sleep or events depends on what the thread is supposed 
to do and what are the incoming signals if any. Using Sleep nothing can 
reach the sleeping thread whilst waiting for events stops the thread 
until something has to be done. On the other hand a periodical awake 
period using the WaitFor... timeout.


L'absence de virus dans ce courrier électronique a été vérifiée par le logiciel antivirus Avast.

More information about the fpc-pascal mailing list