N.I. hasn't made it very easy. They have tried to "help" you by coming up with some threading functions, mostly associated with managing a thread pool which will automagically create a thread for you and execute a function on it, obviating the need for you to ever "know" the actual Win32 thread handle. NI gives you a function to get a ThreadID, but that doesn't do you any good if you need the thread handle: for security purposes, you can't get the thread handle from the ThreadID. It's not clear that the NI "thread ID" is the actual native Win32 ThreadID in any event.
Are you trying to control a thread in another process, or within the same process? If you managed to create a thread within the same process, then you must have a handle for it, unless you let an NI call do it for you.
To correct my earlier response, the native Win32 SDK function CreateThread() does work just fine with the CVI C runtime environment, and it does return a handle to the created thread.
Yes, one way to implement this would be to use a single mutex or semaphore to indicate "run" or "stop" and then, at selected places in the thread function where it makes sense to pause, insert a WaitForSingleObject call. If you then set the semaphore the controlled thread would run until it hit the WaitForSingleObject call, then wait until it was released by the semaphore being cleared by the controlling thread.
If you use the Win32 SuspendThread call, you'll stop the controlled thread at some arbitrary point when the OS gets around to executing the call, though it should happen fairly quickly after you make the call. But, as we know, you'll need the actual Win32 thread handle to do this.
If you use the native Win32 SDK thread functions, you'll have to be aware of the concept of "pseudo-handles" Vs. a true handle. For example, GetCurrentThread() returns a pseudo-handle, not a true handle. A Win32 pseudo handle is only self-referrent - that is, it only functions as a handle within that thread - so it wouldn't work for you to control another thread. you can use the Win32 DuplicateHandle funciton to get a true handle that can be given to another thread.
I'd say find out where the thread that you want to control is being created and change the code if necessary to CreateThread() so you have the Win32 handle, then you can use SuspendThread() and ResumeThread().
Hope this helps.