Click here to Skip to main content
15,885,546 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
hi there,

i've got a win forms application with a producer consumer concept implemented (see application architecture below). i want to change the parameters of the producer B if a parameter is changed in the gui.

my application architecture:
MAIN THREAD (GUI --> contains 2 queues for the threads, receives events from the threads for displaying threadstate)


Thread A
producer A
|
|
V
Thread B <----------- how do i change parameters of this thread after start?
consumer B
producer B
|
|
V
multiple Threads
multiple consumers B


whats the best way to implement this?


best
delicious_cake
Posted
Updated 30-Apr-13 4:47am
v2

Not just changing thread parameters on the fly (when the thread is started) but also passing parameters for start can be effectively solved by using a simple thread wrapper:

C#
internal class ThreadWrapper {

    internal ThreadWrapper(/*..*/) {
        // pass whatever needed from outside:
        Thread = new System.Threading.Thread(Body); //don't tell my it is illegal!
    } //ThreadWrapper

    internal void Start() { this.Thread.Start(); }
    internal void Abort() { this.Thread.Abort(); }

    //and so on...

    internal int Parameter {
        get { lock(lockObject) return fParameter; }
        set { lock(locjObject) fParameter = value; }
    }

    void Body() {
        try {
            while (true) {
                int parameter;
                lock(locjObject) { parameter = fParameter ;}
                //use parameter
            }
        } catch (ThreadAbortExeption e) {
            //post-mortal action in case of Abort
        finally {
            //all other final processing (
    } //Body

    object lockObject = new object();
    int fParameter;

} //class ThreadWrapper


The key here is making the whole instance of the wrapper accessible by the wrapped thread via the implicit "this" parameter which was passed to thread constructor by passing it the non-static method (instance method) Body.

Whatever you do, remember that if you read and/or write any data from/to the wrapper in different threads (one of them could be a wrapped thread, but this is not required) you need to guard the shared memory with lock or System.Threading.ReaderWriterLockSlim, see http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx[^].

—SA
 
Share this answer
 
v3
Comments
Espen Harlinn 10-Jul-11 14:11pm    
Nice reply, my 5
Sergey Alexandrovich Kryukov 10-Jul-11 14:58pm    
Thank you, Espen.
--SA
thatraja 10-Jul-11 16:05pm    
Nice answer, 5!
Sergey Alexandrovich Kryukov 10-Jul-11 17:08pm    
Thank you, Raja. It also help to eliminate useless parametrized thread start and type case associated with it. As "this" is passed, nothing else is needed.
--SA
Here is another neat solution by Gerald Gibson Jr
Create in-process asynchronous services in C#[^]

Best regards
Espen Harlinn
 
Share this answer
 
Comments
Sergey Alexandrovich Kryukov 10-Jul-11 15:11pm    
Yes, interesting article, my 5.
It may be just right for OP or maybe overkill, I don't know -- needs some study and more info about OP's needs.
--SA
Espen Harlinn 10-Jul-11 15:46pm    
Thanks, Sergey, you've also got a few other pieces around the site that might apply :)
thatraja 10-Jul-11 16:07pm    
Looks interesting one, bookmarked that article.
5!
Espen Harlinn 10-Jul-11 16:10pm    
Thank you, thatraja :)

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900