Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. its regarding Multi-threading

its regarding Multi-threading

Scheduled Pinned Locked Moved C#
helpregexquestion
14 Posts 5 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M Mystic_

    i while doing work came up to introducing multi threading in my application but the problem in my case is that the signature of function or functions i want to execute in the thread doesnot match that of delegate "ThreadStart". those parameter that i pass to my functions r very important i have already spend alots of time finalizing them. so anyway out?? i will be very thankful for any kind help.

    E Offline
    E Offline
    Ennis Ray Lynch Jr
    wrote on last edited by
    #2

    Have your method set members within your class and then use thread start within your method with the special parameters. Keep in mind you will have to be very careful of synchronisity when doing this but that is the method I use. (sometimes) A man said to the universe: "Sir I exist!" "However," replied the Universe, "The fact has not created in me A sense of obligation." -- Stephen Crane

    M 1 Reply Last reply
    0
    • E Ennis Ray Lynch Jr

      Have your method set members within your class and then use thread start within your method with the special parameters. Keep in mind you will have to be very careful of synchronisity when doing this but that is the method I use. (sometimes) A man said to the universe: "Sir I exist!" "However," replied the Universe, "The fact has not created in me A sense of obligation." -- Stephen Crane

      M Offline
      M Offline
      Mystic_
      wrote on last edited by
      #3

      its like one class and i use local variables of a method to pass values to these method(those which r passed to ThreadStart delegate). to put it simple and straight. its a switch case statement. in one statement i want to initiate one method and in other case statement i want to intiate an other method. so i have declared a golab Thread instance and initialize it in every case statement. main problem is with the signature of my methods. every time i run the programe, an error appears say that " Method 'Download(string, Testing.Form1.Data, string, string)' does not match delegate 'void System.Threading.WaitCallback(object)'"

      J 1 Reply Last reply
      0
      • M Mystic_

        its like one class and i use local variables of a method to pass values to these method(those which r passed to ThreadStart delegate). to put it simple and straight. its a switch case statement. in one statement i want to initiate one method and in other case statement i want to intiate an other method. so i have declared a golab Thread instance and initialize it in every case statement. main problem is with the signature of my methods. every time i run the programe, an error appears say that " Method 'Download(string, Testing.Form1.Data, string, string)' does not match delegate 'void System.Threading.WaitCallback(object)'"

        J Offline
        J Offline
        Judah Gabriel Himango
        wrote on last edited by
        #4

        Are you using C# 2? If so, you can use anonymous delegates to do this:

        void Foo()
        {
        int val = 5;
        string text = "blah";

        // Use an anonymous method to pass the locals to the function.
        ThreadPool.QueueUserWorkItem(delegate
        {
            OnAnotherThread(val, text);
        });
        

        }

        void OnAnotherThread(int i, string s)
        {
        MessageBox.Show(s);
        }

        Another way--the way that the C# 2 compiler implements it under the hood--is to create a class that stores the variables you want to pass to the function, then create a function in that class whose signatures matches WaitCallback. Here's an example:

        void Foo()
        {
        int val = 5;
        string text = "blah";

        HolderClass holder = new Holder(val, text);
        ThreadPool.QueueUserWorkItem(holder.OnAnotherThread);
        

        }

        class HolderClass
        {
        private int value;
        private string text;

         public HolderClass(int value, string text)
         {
             this.value = value;
             this.text = text;
         }
        
         public void OnAnotherThread(object state)
         {
              MessageBox.Show(this.text);
         }
        

        }

        Tech, life, family, faith: Give me a visit. I'm currently blogging about: Messianic Instrumentals (with audio) The apostle Paul, modernly speaking: Epistles of Paul Judah Himango

        M 2 Replies Last reply
        0
        • J Judah Gabriel Himango

          Are you using C# 2? If so, you can use anonymous delegates to do this:

          void Foo()
          {
          int val = 5;
          string text = "blah";

          // Use an anonymous method to pass the locals to the function.
          ThreadPool.QueueUserWorkItem(delegate
          {
              OnAnotherThread(val, text);
          });
          

          }

          void OnAnotherThread(int i, string s)
          {
          MessageBox.Show(s);
          }

          Another way--the way that the C# 2 compiler implements it under the hood--is to create a class that stores the variables you want to pass to the function, then create a function in that class whose signatures matches WaitCallback. Here's an example:

          void Foo()
          {
          int val = 5;
          string text = "blah";

          HolderClass holder = new Holder(val, text);
          ThreadPool.QueueUserWorkItem(holder.OnAnotherThread);
          

          }

          class HolderClass
          {
          private int value;
          private string text;

           public HolderClass(int value, string text)
           {
               this.value = value;
               this.text = text;
           }
          
           public void OnAnotherThread(object state)
           {
                MessageBox.Show(this.text);
           }
          

          }

          Tech, life, family, faith: Give me a visit. I'm currently blogging about: Messianic Instrumentals (with audio) The apostle Paul, modernly speaking: Epistles of Paul Judah Himango

          M Offline
          M Offline
          Mystic_
          wrote on last edited by
          #5

          iam using VS 2003 and SDK V 1.1 its not supported in my version

          1 Reply Last reply
          0
          • J Judah Gabriel Himango

            Are you using C# 2? If so, you can use anonymous delegates to do this:

            void Foo()
            {
            int val = 5;
            string text = "blah";

            // Use an anonymous method to pass the locals to the function.
            ThreadPool.QueueUserWorkItem(delegate
            {
                OnAnotherThread(val, text);
            });
            

            }

            void OnAnotherThread(int i, string s)
            {
            MessageBox.Show(s);
            }

            Another way--the way that the C# 2 compiler implements it under the hood--is to create a class that stores the variables you want to pass to the function, then create a function in that class whose signatures matches WaitCallback. Here's an example:

            void Foo()
            {
            int val = 5;
            string text = "blah";

            HolderClass holder = new Holder(val, text);
            ThreadPool.QueueUserWorkItem(holder.OnAnotherThread);
            

            }

            class HolderClass
            {
            private int value;
            private string text;

             public HolderClass(int value, string text)
             {
                 this.value = value;
                 this.text = text;
             }
            
             public void OnAnotherThread(object state)
             {
                  MessageBox.Show(this.text);
             }
            

            }

            Tech, life, family, faith: Give me a visit. I'm currently blogging about: Messianic Instrumentals (with audio) The apostle Paul, modernly speaking: Epistles of Paul Judah Himango

            M Offline
            M Offline
            Mystic_
            wrote on last edited by
            #6

            it would be a mess if i do it with global variables. it would be my last resort. if it ever is.

            J J 2 Replies Last reply
            0
            • M Mystic_

              it would be a mess if i do it with global variables. it would be my last resort. if it ever is.

              J Offline
              J Offline
              Jun Du
              wrote on last edited by
              #7

              You don't have to use global data. Instaed, you can create a wrapper class which contains your thread function and all other related methods and data members. The only constraint is that all of the methods and data members should be static. The following C++ code snippets are extracted from my CP article http://www.codeproject.com/useritems/xlogoff.asp[^]. My thread function processes lots of data within the class. One thing to note is that I used mutex to protect the data accessed by more than one thread. Here is the OnStart() in my Windows service code, which simply starts a thread:

              void OnStart(String* args[])
              {
              // Start the communication thread
              Thread *oThread = new Thread(new ThreadStart(0, &XLogoffThread::ThreadProc));
              oThread->Start();

              // some code omitted...

              }

              Here is the thread class which contains a thread function as the delegate function to ThreadStart and all other methods and data:

              public __gc class XLogoffThread
              {
              private: static String* prevSession;
              private: static String* DATA_FILE = S"session.dat";
              private: static ArrayList* baseline = new ArrayList;
              public: static Mutex * mut = new Mutex();
              private: static SnippetsCPU::ProcessAsUser *cpau = new SnippetsCPU::ProcessAsUser();
              // The ThreadProc method is called when the thread starts.

              public: static void ThreadProc()
              {
              try
              {
              // Create the session data file
              if ( !File::Exists(DATA_FILE) )
              {
              File::Create(DATA_FILE);
              }

                // Set the server to listen on port 30000
                Int32 port = 30000;
                IPAddress\* localAddr = IPAddress::Parse(S"127.0.0.1");
                TcpListener\* server = new TcpListener(localAddr, port);
                Byte bytes\[\] = new Byte\[128\];
              
                // Start listening for connections
                server->Start();
              
                // Enter the listening loop.
                while (true) 
                {
                  // Perform a blocking call to accept requests.
                  TcpClient\* client = server->AcceptTcpClient();            
                  String\* data = 0;
              
              // Get a stream for reading and writing
              NetworkStream\* stream = client->GetStream();
              
              // Loop to receive all the data sent by the client.
              do
              {
                // Read bytes
                Int32 i = stream->Read(bytes, 0, bytes->Length);					 
                // Convert to an ASCII string.
                data = Text::Encoding::ASCII->GetStr
              
              M 1 Reply Last reply
              0
              • J Jun Du

                You don't have to use global data. Instaed, you can create a wrapper class which contains your thread function and all other related methods and data members. The only constraint is that all of the methods and data members should be static. The following C++ code snippets are extracted from my CP article http://www.codeproject.com/useritems/xlogoff.asp[^]. My thread function processes lots of data within the class. One thing to note is that I used mutex to protect the data accessed by more than one thread. Here is the OnStart() in my Windows service code, which simply starts a thread:

                void OnStart(String* args[])
                {
                // Start the communication thread
                Thread *oThread = new Thread(new ThreadStart(0, &XLogoffThread::ThreadProc));
                oThread->Start();

                // some code omitted...

                }

                Here is the thread class which contains a thread function as the delegate function to ThreadStart and all other methods and data:

                public __gc class XLogoffThread
                {
                private: static String* prevSession;
                private: static String* DATA_FILE = S"session.dat";
                private: static ArrayList* baseline = new ArrayList;
                public: static Mutex * mut = new Mutex();
                private: static SnippetsCPU::ProcessAsUser *cpau = new SnippetsCPU::ProcessAsUser();
                // The ThreadProc method is called when the thread starts.

                public: static void ThreadProc()
                {
                try
                {
                // Create the session data file
                if ( !File::Exists(DATA_FILE) )
                {
                File::Create(DATA_FILE);
                }

                  // Set the server to listen on port 30000
                  Int32 port = 30000;
                  IPAddress\* localAddr = IPAddress::Parse(S"127.0.0.1");
                  TcpListener\* server = new TcpListener(localAddr, port);
                  Byte bytes\[\] = new Byte\[128\];
                
                  // Start listening for connections
                  server->Start();
                
                  // Enter the listening loop.
                  while (true) 
                  {
                    // Perform a blocking call to accept requests.
                    TcpClient\* client = server->AcceptTcpClient();            
                    String\* data = 0;
                
                // Get a stream for reading and writing
                NetworkStream\* stream = client->GetStream();
                
                // Loop to receive all the data sent by the client.
                do
                {
                  // Read bytes
                  Int32 i = stream->Read(bytes, 0, bytes->Length);					 
                  // Convert to an ASCII string.
                  data = Text::Encoding::ASCII->GetStr
                
                M Offline
                M Offline
                Mystic_
                wrote on last edited by
                #8

                thanx alot buddy. i will try it out. but one thing about ur code of class XLogoffThread. it never use those static properties in the ThreadProc(). so whats the use of those fields. i asked because thats the concept iam going to implement.

                J 1 Reply Last reply
                0
                • M Mystic_

                  thanx alot buddy. i will try it out. but one thing about ur code of class XLogoffThread. it never use those static properties in the ThreadProc(). so whats the use of those fields. i asked because thats the concept iam going to implement.

                  J Offline
                  J Offline
                  Jun Du
                  wrote on last edited by
                  #9

                  ProcessCmd(data) and its delegates use these data. Most of the code has been omitted in the post. You might want to grab the complete code following the link in that post. Best, Jun

                  G M 2 Replies Last reply
                  0
                  • J Jun Du

                    ProcessCmd(data) and its delegates use these data. Most of the code has been omitted in the post. You might want to grab the complete code following the link in that post. Best, Jun

                    G Offline
                    G Offline
                    Gavin Roberts
                    wrote on last edited by
                    #10

                    why don't you just use a delegate?! public delegate void Name(object param1, object param2); private void MyMethod(object param1, object param2) { // do what you need. } then call Name n = new Name(MyMethod); // control being a listView or form etc. control.Invoke(n, new object[] { "test", "test2" });

                    M 1 Reply Last reply
                    0
                    • M Mystic_

                      it would be a mess if i do it with global variables. it would be my last resort. if it ever is.

                      J Offline
                      J Offline
                      Judah Gabriel Himango
                      wrote on last edited by
                      #11

                      Who said anything about globals? There are no globals in C#; everything belongs to a class. Use the second example I gave, it would work fine for you.

                      Tech, life, family, faith: Give me a visit. I'm currently blogging about: Messianic Instrumentals (with audio) The apostle Paul, modernly speaking: Epistles of Paul Judah Himango

                      M 1 Reply Last reply
                      0
                      • J Judah Gabriel Himango

                        Who said anything about globals? There are no globals in C#; everything belongs to a class. Use the second example I gave, it would work fine for you.

                        Tech, life, family, faith: Give me a visit. I'm currently blogging about: Messianic Instrumentals (with audio) The apostle Paul, modernly speaking: Epistles of Paul Judah Himango

                        M Offline
                        M Offline
                        Mystic_
                        wrote on last edited by
                        #12

                        i meant golab in a class. its bit vague term but i use it for public members of a class.

                        1 Reply Last reply
                        0
                        • G Gavin Roberts

                          why don't you just use a delegate?! public delegate void Name(object param1, object param2); private void MyMethod(object param1, object param2) { // do what you need. } then call Name n = new Name(MyMethod); // control being a listView or form etc. control.Invoke(n, new object[] { "test", "test2" });

                          M Offline
                          M Offline
                          Mystic_
                          wrote on last edited by
                          #13

                          yeh but annoymus delegate wont work with .Net 1.1. i have that one. there got to be other solutions for this version as well.

                          1 Reply Last reply
                          0
                          • J Jun Du

                            ProcessCmd(data) and its delegates use these data. Most of the code has been omitted in the post. You might want to grab the complete code following the link in that post. Best, Jun

                            M Offline
                            M Offline
                            Mystic_
                            wrote on last edited by
                            #14

                            i got ur point and i have already transformed my code in way u said. its doing great. thanx buddy

                            1 Reply Last reply
                            0
                            Reply
                            • Reply as topic
                            Log in to reply
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes


                            • Login

                            • Don't have an account? Register

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Categories
                            • Recent
                            • Tags
                            • Popular
                            • World
                            • Users
                            • Groups