Hyper-threading exposes multiple logical cores for a single physical CPU core. In simple terms, hyper-threading makes context-switching more efficient for each CPU core.
Dual-core chips, on the other hand, actually have two physical CPU cores which can execute different processes simultaneously.