Avatar billede krismort Nybegynder
01. oktober 2002 - 18:40 Der er 8 kommentarer og
2 løsninger

forskel på threads?

Hvad er forskellen mellem oprettelsen af en thread med _beginthread og CreateThread ?

Jeg har en thread .. denne thread ligger faktisk implementeret i et static libery der bliver linket ind i mit klient projekts kode ved compile... Der bruger jeg _beginthread til at starte tråden med, problemet er at den tråd sløver hele systemet og mit klient projekt. Nogen bud på hvorfor det sker ?

Kristian
Avatar billede jespernaur Nybegynder
01. oktober 2002 - 19:23 #1
Hvad laver den tråd?
Avatar billede krismort Nybegynder
01. oktober 2002 - 20:36 #2
Tråden laver ikke noget systemkrævede det er bare et ganske lille loop .. jeg fjernede sågar alle beregninger i loopet så den ikke lavet andet end while(bThrRunning) {}
men det skabte stadig problemer med resourcer, Jeg har i mellemtiden fundet ud af at hvis jeg bruger CreateThread så kan jeg undgå de problemer.. så spørgsmålet lyder mere på hvad forskellen på de 2 metoder er.

Kristian
Avatar billede jespernaur Nybegynder
01. oktober 2002 - 21:42 #3
Jeg fandt en 'sammenlignende omtale' af _beginthread og CreateThread etc her:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt__beginthread.2c_._beginthreadex.asp

Måske kan du bruge det til noget. Men - uanset hvordan du bærer dig ad: Hvis du har en tråd som den viste ( while(bThrRunning) {} ), er der jo tale om en løkke, der vil sluge al tilgængelig CPU-tid, der ikke bliver brugt af andet. Hvis tråden så ikke har laveste prioritet i systemet, vil det direkte forhindre, at eventuelle system-tråde med lavere prioritet overhovedet kan køre.

Har du virkelig brug for, at denne tråd skal køre uendeligt for fuld fart?

Mvh
Jesper Naur
Avatar billede jpk Nybegynder
02. oktober 2002 - 09:14 #4
"Jeg har i mellemtiden fundet ud af at hvis jeg bruger CreateThread så kan jeg undgå de problemer"

Har du prøvet..?

koden:
while(bThrRunning) {}
er jo et tight loop og vil forsøge at bruge al CPU-tid LIGE MEGET hvordan du starter tråden...
Avatar billede soepro Nybegynder
03. oktober 2002 - 10:48 #5
Forskellen mellem de to metoder er et sprøgsmål om hvornår selve tråden begynder at køre. Med CreateThread() kan du vælge om tråden skal starte med det samme, eller først når du giver den en ResumeThread - og du kan styre dens . Med -beginthread startes tråden med det samme - og du kan ikke styre dens prioritet, så den får formentlig samme prioritet som dit nuværende program.
Avatar billede soepro Nybegynder
03. oktober 2002 - 11:12 #6
Sorry - det var for tidligt :

Der er flere forskelle mellem de to metoder:

1) For det første styring af hvornår selve tråden begynder at køre
Med CreateThread() kan du vælge om tråden skal starte med det samme, eller først når du giver den en ResumeThread. Med beginthread startes tråden med det samme.

2) Typen af funktioner som tråden anvender
I Windows API HElp guiden står der "A thread that uses functions from the C run-time libraries should use the beginthread and endthread C run-time functions for thread management rather than CreateThread and ExitThread. Failure to do so results in small memory leaks when ExitThread is called." Dette skyldes formentlig at standard biliotekerne ikke er lavet thread-safe, dvs. du kan risikere at din gamle hovedtråd og den nye tråd "spænder ben" for hindanden, f.eks. når du anvender printf(), strcpy() osv. og at de derfor heller ikke kan rydde korrekt op efter sig. (Hvilken af de to tråde en der sidste til at anvende dem ?!?)

At din maskine hænger skyldes sikkert som tidligere skrevet, at den nye tråd får samme prioritet som din oprindelige hovedtråd - og så vil dit "tight loop" selvfølge trække al den CPU den får lov til. Det kan du undgår ved at sænke prioteteten på den nye tråd. Priority kan sættes til en af følgende værdier via SetThreadPriority() metoden (MSDK help):

THREAD_PRIORITY_ABOVE_NORMAL    Indicates 1 point above normal priority for the priority class.
THREAD_PRIORITY_BELOW_NORMAL    Indicates 1 point below normal priority for the priority class.
THREAD_PRIORITY_HIGHEST    Indicates 2 points above normal priority for the priority class.
THREAD_PRIORITY_IDLE    Indicates a base priority level of 1 for IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, or HIGH_PRIORITY_CLASS processes, and a base priority level of 16 for REALTIME_PRIORITY_CLASS processes.
THREAD_PRIORITY_LOWEST    Indicates 2 points below normal priority for the priority class.
THREAD_PRIORITY_NORMAL    Indicates normal priority for the priority class.
THREAD_PRIORITY_TIME_CRITICAL    Indicates a base priority level of 15 for IDLE_PRIORITY_CLASS, NORMAL_PRIORITY_CLASS, or HIGH_PRIORITY_CLASS processes, and a base priority level of 31 for REALTIME_PRIORITY_CLASS processes.

Så du skal jo nok vælge THREAD_PRIORITY_BELOW_NORMAL eller lignende.
Avatar billede jpk Nybegynder
03. oktober 2002 - 11:17 #7
Men, igen, hvad laver tråden?
Avatar billede soepro Nybegynder
03. oktober 2002 - 13:50 #8
jpk >> Ovenstående fra MSDK Help'en kunne jo indikerer at beginthread laver nogle ekstra checks aht. oprydning osv. - det kunne vel godt "trække ekstra tænder ud" eller ?
Avatar billede jpk Nybegynder
03. oktober 2002 - 14:16 #9
soepro >> Måske, men jeg tror nu ikke det er videre mærkbart..?

Jeg ville dog godt vide om tråden skal lave et stykke arbejde fra start til slut, eller det er noget "løbende", hvor der ikke hele tiden er noget at lave...
I sidste tilfælde ville en Sleep jo være på sin plads og kunne sikkert løse problemet!
Avatar billede soepro Nybegynder
03. oktober 2002 - 15:59 #10
jpk >> Eller hvis tråden skal reagere på/behandle en event, så lade tråden "slutte" sig selv efter hver omgang med SuspendThread) og så lade den event der skal reageres på fyre en ResumeThread()
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester