Avatar billede bjarke Nybegynder
08. december 2000 - 15:25 Der er 8 kommentarer og
2 løsninger

Standse en proces

Jeg er ved at lave et program, som udfører en langvarig beregning. Beregningen udføres når brugeren trykker på en tast, som medfører et kald til en metode.

I princippet forestillede jeg mig noget lignende nedenstående, men det virker ikke, fordi jeg kan overhovedet ingenting gør, når while(1) alias beregningerne begynder. Men hvordan løser jeg så problemet?


void __fastcall TForm1::StartClick(TObject *Sender)
{
    running = 1;

    // Her skal beregningerne udføres, men standse hvis
    // running=0
    while(1)
    {
        if( running == 0 ) return;
    }

    // Beregningerne er her slut
    running = 0;
}

void __fastcall TForm1::StopClick(TObject *Sender)
{
    running = 0;
}


Bjarke
Avatar billede jpk Nybegynder
08. december 2000 - 17:40 #1
Du skal foretage dine beregninger i en seperat tråd.
Således kan du stadig modtage messages fra dit program og standse tråden hvis det er nødvendigt!
Avatar billede bjarke Nybegynder
08. december 2000 - 19:07 #2
Ok, men hvordan gør jeg det?
Avatar billede bjarke Nybegynder
08. december 2000 - 21:58 #3
Jeg har fået noget til at virke, men er det rigtigt det jeg lavet her (inklusiv mine kommentarer):

******************* UNIT1.CPP ************************

#include \"Unit1.h\"
#include \"Unit2.h\"

TForm1 *Form1;
Beregning *b;

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    b = new Beregning(false);
}

void __fastcall TForm1::Button2Click(TObject *Sender)
{
    b->Terminate();
}

******************* UNIT2.CPP ************************

#include \"Unit1.h\"
#include \"Unit2.h\"

void __fastcall Beregning::Execute()
{
    // For at rydde op i memory når tråden slutter
    FreeOnTerminate = true;

    // Simulering af langvarig beregning
    for( float i=0; i<1e30; i++ )
    {
        Form1->Edit1->Text = ++i;

        // Slut hvis Terminated egenskaben er sat
        if( Terminated == true ) return;
    }
}
Avatar billede stigc Nybegynder
10. december 2000 - 14:11 #4
se det her ind i et at dine loops:

    Application->ProcessMessages();
Avatar billede bjarke Nybegynder
11. december 2000 - 11:24 #5
stigc >> Vil jeg så kunne spare det med at lave en ekstra tråd?
Avatar billede stigc Nybegynder
11. december 2000 - 22:18 #6
ja.........

men det er ikke nær så effektivt!
Avatar billede moykal Nybegynder
12. december 2000 - 23:52 #7
Hvis du har en applikation med en brugerflade, og du har langvarige beregninger bør man gøre et eller andet for at sørge for at brugerfladen er responsiv. Man gør det som regel på flg. måder:

1) Idle-processing, dvs. en funktion/metode, der udføres, når systemet ikke har andet at lave. Under Windows har du direkte en idle-message og under X-Windows kan du sætte WorkProcedures op. Selvom dette sparer dig for en masse - tror du - så stiller dette til gengæld store krav til hvor små iterationerne i arbejdet må være, for at du ikke får en ikke-responsiv app.
2) Tråde er gode og enkle at håndtere, og det gælder både under Win32 og pthreads under UNIX. Og det med effektiviteten af tråde forstår jeg ikke rigtigt, for man kan sætte thread-priority temmeligt højt, således at det bare kører derudaf. Men det er som regel ikke anbefalelsesværdigt. Hvis du kører Windoze og den gamle MFC, findes der en tråd-klasse, du kan bruge direkte (CWinThread). Ellers har jeg et lille bibliotek du kan få, hvor du blot skal specialisere en enkelt metode, så har du en virkende tråd. Og den er som sagt et ægte objekt, så den ryder ordentligt op (efter sig selv) ved objekt-destruktion.

mvh.

Moykal

PS: Hvis du er interesseret i trådklassen, så sig til (michael_w_olesen@hotmail.com). Hvis du anvender COM, skal der lige lidt instruktion til, hvorledes du \"overrider\" to mere metoder etc.
Avatar billede bjarke Nybegynder
13. december 2000 - 11:55 #8
Tak for hjælpen. Jeg har fået det til at virke med tråden, så jeg tror, at jeg bare holder fast ved det i denne omgang.

Moykal >> Jeg bruger Borland Builder, så jeg bruger (vel?) ikke MFC. Men ellers tak for tilbudet om trådklassen.
Avatar billede moykal Nybegynder
13. december 2000 - 12:43 #9
Så anvender du formodentligt ikke MFC, jeg kender ikke Borland, men de har sikkert deres eget klasse-bibliotek. Hvis du skal anvende flere tråde, der evt. kan finde på at accessere fælles/global data, så kan du også fint gå igang med at læse om CRITICAL_SECTION\'s, Mutex\'es, Semaphores og Events... Igen... skriv bare, hvis du mangler eksempler.

moykal
Avatar billede bjarke Nybegynder
13. december 2000 - 14:39 #10
Tak :-)
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