Nu sunt conștient de niciun API care să facă planificatorul sistemului de operare să facă ceea ce doriți (chiar dacă firul dvs. este prioritar în regim de așteptare, dacă nu există thread-uri cu prioritate mai mare, al tău va fi rulat). Cu toate acestea, cred că puteți improviza o funcție destul de elegantă, pe baza a ceea ce faceți deja. În esență (nu am o mașină Windows dev la îndemână):
Alegeți o sumă prestabilită de timp în care firul va dormi în fiecare iterație. Apoi, la fiecare iterație (sau la fiecare iterație n, astfel încât funcția de reglaj nu devine ea însăși o încărcare semnificativă a procesorului)
- Calculați timpul procesorului utilizat de firul dvs. de la ultima dată când ați apelat funcția de reglaj (voi numi acest dCPU). Puteți utiliza API-ul GetThreadTimes() pentru a obține perioada de timp firul a fost executat.
- Calculați cantitatea de timp real scurs de la ultima dată când a fost apelată funcția de reglaj (vom numi acest dClock).
- dCPU / dClock este procentul utilizării CPU (a unui CPU). Dacă este mai mare decât doriți, măriți timpul de somn, dacă este mai mic, reduceți timpul de somn.
- Țineți firul în timpul calculat.
În funcție de modul în care supraveghetorul dvs. utilizează CPU, este posibil să doriți să utilizați GetProcessAffinityMask() pentru a afla câte CPU are sistemul. dCPU / (CPU-uri dClock *) reprezintă procentajul din timpul total al procesorului disponibil.
Veți avea totuși nevoie să alegeți numere magice pentru timpul de somn inițial și suma incrementării / decrementării, dar cred că acest algoritm ar putea fi reglat pentru a menține un fir care rulează aproape la un procent determinat de procesor.