views:

85

answers:

3

Hello,

I am trying to get a thread working in C# to reset the time and run another function alongside it. The code I have is:

Thread loopTime = new Thread(this.someFunction);
loopTime.Start();

for (int i = 0; i < 20; i++)
{
    ChangeTimeFunction(someTime);
    Thread.Sleep(200);
}

I am getting a threading error if I pass in this.SomeFunction(). This cannot be used according to Visual Studio. I could have the for loop as a thread but I do not know how to pass in the variable someTime.

Is there a way to either pass the variable into the loop if it was a function or call the for loop from within the function.

Thanks for any help.

UPDATE:

someFunction is a recorded methods using Visual Studio. This cannot be used outside the main thread. I would need to put the for loop inside the thread I am creating. Does any one know how to do this?

Thanks

A: 

I think this link: http://msdn.microsoft.com/en-us/library/aa645740%28VS.71%29.aspx can explain what you need to do. It seems the ThreadStart delaget will allow you to pass it a function to execute when the thread is started.

JMcCarty
A: 

It does not sound like problem of "this" qualifier.

Does your someFunction accept a parameter? If yes you can either:

  1. Make it parameterless and pass data thru member field
  2. Use can use closure to pass variable from the outer scope.

    int i = 2;
    Thread t = new Thread(x =>
                              {
                                  i++;                                      
                              });
    
    
    t.Start();
    
Alex Krupnov
+3  A: 

Is there a way to either pass the variable into the loop if it was a function or call the for loop from within the function.

.NET has two delegates for starting threads. The first is ThreadStart, which just calls a method with no arguments.

The second is ParameterizedThreadStart, which calls a method with a single object as a parameter.

C# will implicitly create a ParameterizedThreadStart delegate if you pass a method in the Thread constructor that has an object argument. You then send an object to it using the thread's .Start(Object) method.

For example, to make the for loop a thread, assuming someTime is a DateTime and including a cast to that effect:

Thread loopTime = new Thread(someFunction);
loopTime.Start(someTime);

public void someFunction(object someTime) {
    for (int i = 0; i < 20; i++)
    {
        // Note the cast here... I assumed it's a DateTime
        ChangeTimeFunction((DateTime) someTime);
        Thread.Sleep(200);
    }
}
R. Bemrose
@ R. Bemrose -- The ParameterizedThreadStart link was perfect. Thanks +1
chrissygormley