Avatar billede garlan Nybegynder
18. maj 2004 - 15:55 Der er 7 kommentarer

Threads & timer

Hej

miljø: .net 2003 projekt: windows service (c++)

Jeg har lavet et windows service program.
jeg benytter en timer i en thread, og når den udløber sker der en event!
det er så meningen at eventen skal sætte en member variabel, så
programmet kan se at timeren er udløbet.
Hvis jeg udlæser variablen fra mit program, kan jeg se at den ikke er blivet sat! selvom eventen er blivet kaldt!
hvordan sætter jeg denne member variabel?

Garlan
Avatar billede jpk Nybegynder
18. maj 2004 - 16:06 #1
Hvis en variabel skal ændres fra en tråd og det samtidig skal kunne ses fra en anden, skal den erklæres volatile.

Ex:
volatile int m_nState;
Avatar billede jpk Nybegynder
18. maj 2004 - 16:07 #2
Altså, hvis ændringen skal kunne ses.
volatile gør, at variablen skrives/læses hver gang den tilgås og altså ikke caches i den enkelte tråd.
Avatar billede garlan Nybegynder
18. maj 2004 - 16:42 #3
Det er ikke det!
jeg bruger allerede volatile på min member variabel.
Avatar billede segmose Nybegynder
18. maj 2004 - 16:49 #4
Kunne vi se din erklæring.
Avatar billede jpk Nybegynder
18. maj 2004 - 16:51 #5
Så må du forklare mere præcist...

- Du skriver eventen er udført, betyder det at du har verificeret at variablen bliver sat i koden eller eller hvad..?

Og er du sikker på at det er den egentlig member der bliver sat, ikke bare en variable overført by value?
Avatar billede garlan Nybegynder
18. maj 2004 - 16:59 #6
public:
            Array* myIntArray;
            int nRow;
            volatile int TimeElapsed;
            int cols;
            bool stopping;

        void StartTimer()
        {
            System::Timers::Timer* aTimer = new System::Timers::Timer;
            aTimer->Elapsed += new System::Timers::ElapsedEventHandler(this, &AlarmServiceWinService::OnTimedEvent);
            // Set the Interval to 30 minuts.
            aTimer->Interval=1000;
            aTimer->Enabled=true;
        }
        void StopTimer()
        {
            timer1->Enabled = false;
        }
        void OnTimedEvent(Object* o, System::Timers::ElapsedEventArgs*){
            AlarmServiceWinService* p = new AlarmServiceWinService;
            p->TimeElapsed = 1;
            // Create a FileStream
            FileStream* fs = new FileStream("output.txt", FileMode::Append);
            // Create a StreamWriter
            StreamWriter* sw = new StreamWriter(fs);
            // Write some text
            sw->WriteLine("OnTimedEvent");
            sw->WriteLine("\r");
            sw->Flush();
            sw->Close();
        }
        void ReturnBoxId(void){
            AlarmServiceWinService* p = new AlarmServiceWinService;
            // Create a FileStream
            FileStream* fs = new FileStream("output.txt", FileMode::Append);
            // Create a StreamWriter
            StreamWriter* sw = new StreamWriter(fs);
            // Write some text
           
                sw->WriteLine(p->TimeElapsed);
                sw->WriteLine("\r");
           
            sw->Flush();
            sw->Close();
           
        }
Når timeren udløber bliver funktionen OnTimedEvent() kørt,
den sætter TimeElapsed til 1

når jeg kalder funktion void ReturnBoxId() fra main for at udskrive hvad der står i TimeElapsed, udskriver den 0 den skulle skrive 1!
Avatar billede jpk Nybegynder
18. maj 2004 - 17:18 #7
Du opretter jo et nyt objekt hver gang!
Så har det da ingen effekt at sætte en variabel...
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