windows - Suspending og genoptagelse af tråde i c ++

Indlæg af Hanne Mølgaard Plasc

Problem





Min ansøgning skal suspendere og genoptage en anden proces hver få * microsec * s.

Det virker fint kun nogle gange, det føles som om det suspenderer processen for ikke-uniformer gange.

Jeg bruger win API: ResumeThread og SuspendThread.


På den anden side forsøgte jeg noget lidt anderledes.

Jeg suspenderede tråden som sædvanlig med SuspendThread, men når jeg genoptager den, kan jeg lide det:


while (ResumeThread(threadHandle) > 0);


og det virker hurtigere, og det kører den anden proces i et ensartet tempo.

Hvorfor sker det? er det muligt, at tråden undertiden bliver suspenderet to gange, og derefter fortsætter kommandoen ResumeThread?

tak :)

Bedste reference


SuspendThread() opkald suspenderer ikke en tråd med det samme. Det tager flere tid at gemme en eksekveringskontekst, så ResumeThread() kan blive kaldt, når en tråd ikke er suspenderet endnu. Det er derfor, while (ResumeThread(threadHandle) > 0); virker. For at bestemme den aktuelle trådstatus kan du ringe NtQueryInformationThread (), men kun i NT versioner af Windows. [15]


Hvis du har en loop i den sekundære tråd, kan du ændre din synkronisering med en Manuel Reset-begivenhed. Den primære tråd skal ringe ResetEvent() for at suspendere en tråd og SetEvent() for at genoptage. Den sekundære tråd hvert kredsløb skal ringe WaitForSingleObjectEx().

Andre referencer 1


Jeg fulgte Damons forslag, fjernede suspendering/genoptagelse fra koden og i stedet brugte en synkroniseringsobjekt over hvilken min pool tråd venter uendeligt efter færdiggørelsen af ​​arbejdet, og det samme signaleres af min server tråd efter tildeling af arbejde til det.


Den eneste gang jeg skal bruge suspendere nu, er, når jeg laver tråden for første gang, og efter tildeling af arbejde til den genoptages tråden fra min servertråd. Den tråd, der oprettes, bruges i en trådpulje igen og igen for at gøre noget arbejde.


Det virker som en charme.


Tak Damon!


Hilsen,


Ajay

Andre referencer 2


det er den måde, de loop look ser ud som om


for(i=0;i<num;i++) {     
  while (ResumeThread(threadHandle) > 0);
  ResumeThread(threadHandle)
  SuspendThread(threadHandle);      
}


SuspendThread tager nogle millisekunder, så mens sløjfen fortsætter, indtil tråden er suspenderet. Derefter kaldes trådprocessen SuspendThread funktionen, en god måde at ringe GetProcessContext for at se EIP