I'm wondering a bit how this is implemented, if you have one thread on one core that wants to use a lot of processing power will it be limited to 50% usage of one core or allowed to use 100% until another thread comes along at which point the core usage is dynamically shared by the two threads?
Hyperthreading only makes sense when you understand that 'CPU use' graphs like the one in the task manager are very, very crude. It's just a count of idle and busy cycles over a small period of time (a second or so).
Using a simplified example with small numbers to make this easier on my poor brain (

) - if a CPU runs at 20MHz then it has 20,000,000 available cycles every second. If it spends 5,000,000 cycles processing instructions and the other 15,000,000 doing nothing then the CPU meter will show the processor as 25% busy.
But CPU cores are complex devices and even though it is busy the instruction its working on may not use all the core's resources - resources that could be use for something useful.
To put this in human terms: I'm 'idle' when sitting doing nothing and 'busy' when drinking a cup of tea. But I still have one hand free, so I can scratch my nose at the same time as drinking tea. If I'm carrying a block of concrete then I don't have a spare hand and scratching my nose will have to wait.
That's what Hyperthreading is. A second thread that can use bits of the core not needed by the first thread. If both threads need access to the same part of the CPU then the second thread gets paused until the first one is done with that particular resource. There is also a timer that will eventually kick the first thread out of the way to prevent the second one from sitting too long as it may be latency-sensitive code like video or sound stuff.
So in an ideal situation Hyperthreading can magic extra performance from a CPU that claims to be 100% busy. In the worst case it can actually reduce performance due to management overhead. The original HT version on the Pentium 4 was a bit meh, but maybe the i7 one is better.