Man studiert Informatik mit Spezialisierung auf Parallelrechnen.
Scherz beiseite: im Grunde mußt du
GUI und die Arbeit des Programms weitmöglichst trennen. Außerdem sollte die Arbeit möglichst auf mehrere Threads aufgeteilt werden. Bei mehreren Threads ist zwar Synchronisierung nötig, aber die sollte um der besseren Parallelisierung willen nur dort auftauchen, wo notwendig. Ansonsten wartet wieder ein Thread auf den anderen und du hast Serialisierung statt Parallelisierung. Zur Synchronisierung: Critical Sections, Semaphoren, Mutexe usw.
Aber selbst wenn du das in deinem Programm ganz toll implementierst, wirst du in fast keinem Programm auf einem normalen Windowssystem diese Vorgehensweise (und damit Effizienz) finden.