I was just wondering if there is an elegant way to set the maximum CPU load for a particular thread doing intensive calculations.
Right now I have located the most time consuming loop in the thread (it does only compression) and use GetTickCount()
and Sleep()
with hardcoded values. It makes sure that the loop continues for a certain period of time and than sleeps for a certain minimal time. It more or less does the job i.e. guarantees that the thread will not use more than 50% of CPU.
However behavior is dependent on the number of CPU cores (huge disadvantage) and simply ugly (smaller disadvantage :)).
Any ideas?
Nu pot sa ma gandesc la nici o modalitate de cross-platforma a ceea ce vrei (sau orice modalitate garantata de oprire completa), dar pe masura ce folosesti GetTickCount, poate nu esti interesat de cross platform :)
Aș folosi comunicații interprocese și stabilește nivelurile proceselor intense pentru a obține ceea ce ai nevoie, dar nu sunt sigur că este potrivit pentru situația ta.
EDITAȚI | ×: Sunt de acord cu Bernard și de aceea cred că un proces, mai degrabă decât un fir, ar putea fi mai potrivit, dar poate că nu este potrivit scopurile voastre.
Pe linux, puteți schimba prioritatea de programare a unui fir cu nice ().
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)
Î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.
Problema este că nu este normal să doriți să lăsați CPU-ul inactiv în timp ce aveți de lucru. În mod normal, ați setat o sarcină de fundal la prioritatea IDLE și lăsați-o pe sistemul de operare să gestioneze programarea întregului timp CPU care nu este utilizat de sarcini interactive.
Mi se pare ca problema este procesul de supraveghere.
Dacă sarcina dvs. de fundal este legată de CPU, atunci doriți ca aceasta să ia tot timpul neutilizat al procesorului pentru sarcina sa.
Poate ar trebui să te uiți la fixarea programului de supraveghere?
S-ar putea să schimbați prioritatea unui fir, dar schimbarea utilizării maxime ar necesita fie sondare, fie hack-uri pentru a limita câte lucruri au avut loc sau pentru a folosi instrumentele de sistem care pot stabili utilizarea maximă a unui proces. Cu toate acestea, nu văd nici o circumstanță în care doriți să faceți acest lucru.