Correct? Then what is the point of having 2 types of commands doing the same thing? There must be some reasons.
One more question, what is the best way to handle testing that would jump back and forth to machines all over the place? At the beginning of the scripts, just do Connect( box1), Connect(box2) etc, etc and then use SetMachine as needed.
I think that Reg_CreateValue may run without needing an agent to be spawned (localhost testing). When working through the agent on a remote machine use Sys_SetRegistryValue.
Your question about hopping from machine to machine depends on how many agent licenses you have. If you have many of them, then you can basically do what you've described. If you don't have enough agents for all the machines, then you need to write special code for killing agents just after you disconnect (could possibly shut the box down). You will then need to use some remote execution trick to start the agent on the next machine.
You are right there is no need to have two functions that does the samething but there is a difference between these two functions
SYS_SetRegistryValue does not create the value it has to exist (from Help but not testing, I am sure they know what they are talking about; that's only one operation).
Reg_CreateValue creates and sets the value's data (that's two operations)
SilkTest (or IDE) and agent process is for configuration like yours where only agents are installed on remote machines hence functions that are only available for the IDE won't be able to be called by the agent (I don't think it's a concern for most of the stuff).
My understand of the thread/machine thingy:
The machine handle operator lets you specify in a convenient, readable way the target machine for a function to be executed by the Agent in a distributed testing environment. Use it to override the default machine specified for the current thread.
The SetMachine command directs the code in that thread to the Agent on the specified machine. But the ["server"] machine handle operator directs the code in the doThis function to the machine named "server." The code following the doThis invocation continues to be sent to the sMachine specified in the SetMachine command. - Help
SetMachine("Server") //set all following calls at machine called "Server"
//All of them are the same
MachineHandle->DoSome // is the same as DoSome()
["Server"]DoSome() //single statement directed to machine called "Server"
In the help they use a for each loop of all machine names and use the square bracket to run the function you want to launch on individual machines.