Avatar billede sbruun Nybegynder
09. august 2007 - 15:17 Der 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.

Simon
Avatar billede bertelbrander Novice
09. august 2007 - 19:56 #1
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.
Avatar billede sbruun Nybegynder
10. august 2007 - 07:59 #2
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.
Avatar billede kenneth_gorking Nybegynder
10. august 2007 - 13:20 #3
Hvis du kalder funktionen i en seprat tråd, er det meget nemt at give den en højere prioritet end resten af programmet.

Lav en ny tråd med CreateThread(): http://msdn2.microsoft.com/en-us/library/ms682453.aspx
og set dens prioritet med SetThreadPriority(): http://msdn2.microsoft.com/en-us/library/ms686277.aspx
Avatar billede arne_v Ekspert
13. august 2007 - 03:07 #4
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.
Avatar billede sbruun Nybegynder
13. august 2007 - 13:33 #5
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:(
Avatar billede arne_v Ekspert
14. august 2007 - 02:48 #6
#include <stdio.h>

#include "windows.h"

int main()
{
    printf("%d\n", GetThreadPriority(GetCurrentThread()));
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_ABOVE_NORMAL);
    printf("%d\n", GetThreadPriority(GetCurrentThread()));
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_HIGHEST);
    printf("%d\n", GetThreadPriority(GetCurrentThread()));
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
    printf("%d\n", GetThreadPriority(GetCurrentThread()));
    SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_NORMAL);
    printf("%d\n", GetThreadPriority(GetCurrentThread()));
    return 0;
}
Avatar billede sbruun Nybegynder
14. august 2007 - 10:38 #7
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?
Avatar billede kenneth_gorking Nybegynder
14. august 2007 - 16:29 #8
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.
Avatar billede sbruun Nybegynder
15. august 2007 - 14:09 #9
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.

/Simon
Avatar billede kenneth_gorking Nybegynder
17. august 2007 - 17:56 #10
Svar
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