09. august 2007 - 15:17Der er
9 kommentarer og 1 løsning
tråd priotet
Ligger inde med en gammel applikation, ca. 10 år, skrevet i c++, er det muligt at sætte cpu'ens priotet i top for en enkel funktion i hele applikationen? evt. ved at oprette det som en tråd eller noget lignende? Applikationen er skrevet i Visual c++ 6.0, så .net er ikke eksisterende, og skal heller ikke benyttes til en evt. løsning. Det er et lidt kryptisk spørgsmål, håber på svar.
Man kan ikke rigtigt give én funktion højere prioritet, man skal lave en tråd og få den til at lave arbejdet. Vi er nok nødt til at vide mere om din applikation for at kunne hjælpe mere.
Det er et grafisk program, hvor man efter tryk på en knap kører en stump kode der er meget tidskritisk, da denne stump kode kommunikerer gennem en comport til noget hardware. Tanken er så, at det er pga. fordeling af resourser i styresystemet vil kunne opstå tidsmæssige problemer. Programmet er prøvet på flere pc'er, og det er ikke ved alle at der opstår problemer med timing. Derfor ønsker jeg at give programmet høj priotet, så snart der bliver trykket på knappen, således at cpu'en koncentrerer sig udelukkende om dette. Hvordan ville det kunne implementeres? Skal siges jeg ikke er så stærk i programmet "visual c++ 6.0", selve softwaren er gammel, og giver ikke meget hjælp, men det er nu engang det udviklingsmiljø der er til rådighed.
Det behøver vel strengt taget ikke gøres for en separat tråd. Man kan vel bare hæve prioriteten på current tråd, kalde funktionen og så sænke prioriteten til normal igen.
Hvordan ændrer man priotet af selve "programmet" over en kort periode (stump kode)? Kan det i det hele tage lade sig gøre? Jeg har forsøgt mig med at oprette en tråd. Men kan ikke linke den direkte til en medlemsfunktion?! Jeg kan istedet lave en ganske almindelig funktion og så kalde den, hvilket ikke bliver særlig pænt, og heller ikke virker optimalt. Modtager en lang række access violations. Så back to square one:(
Det giver desværre stadig fejl til trods for at jeg hæver prioteten på samme måde som arne v foreslår. Efter lidt bøvl har jeg også prøvet mig med at lave en tråd og starte den med det ønskede kode, det gav så en exception, hvilket jeg troede kunne afhjælpes med en semaphor. Dette var dog ikke tilfældet, til trods for jeg afbrød "main" programmet og kun lod tråden køre indtil den var færdig, og frigav semaphoren. Der opstår stadig en exception som følger: Unhandled exception in filename.exe (KERNEL32.DLL) 0xC0000005: Access violation. Nogen gode forslag?
En 0xC0000005 exception betyder at der bliver skrevet til hukommelse som programmet ikke har adgang til. Hvis du starter programmet fra Visual C++ med debuggeren hægtet på (F5), så burde den vise dig nogenlunde hvor det er den exception sker. Jeg kan se at det sker i kernel32.dll, så du kan ikke komme til at se koden direkte (medmindre du gider at tonse igennem assembly :)). Du burde i det mindste kunne se kaldet fra dit program der fører til den exception, og hvis du er heldig, er det måske en variabel som du selv kan rette.
Det har vist sig ikke at være noget der kan løses med tråde og prioteter, derimod er der tale om en fejl vedrørende læsning af en comport. Dette vil jeg lave et nyt spørgsmål om. Jeg ved ikke hvem der vil have pointene, i princippet er det vel kenneth_gorking der svarede hurtigst, du er derfor velkommen til at komme med et svar.
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.