Avatar billede olesen85 Nybegynder
16. september 2011 - 10:00 Der er 7 kommentarer og
1 løsning

Stop while med button

Hej jeg skal havde stoppet en shile som køre i en anden class end min form. se koden her under

namespace DataReader_L7
{
    public partial class Form1 : Form
    {
       
        private void start_but_Click(object sender, EventArgs e)
        {

            //start
          button2.Visible = true;
            start_but.Visible = false;
            com.ReadOptions();
            com.openport();
            access.ReadOptions();
            access.opencon();
            exit_loop = 0;
            do
            {
                PA1 = com.readstring();  //Readstring med den while som skal stoppes starters her
                access.makestring(PA1);
                access.DBcomand();
                Application.DoEvents();
            }
            while (exit_loop == 0);
        }


        public void button2_Click(object sender, EventArgs e)
        {
            //Stop
            com.closeport();
            access.closecon();
            start_but.Visible = true;
            button2.Visible = false;
            exit_loop = 1;
           
           
        }


namespace DataReader_L7
{
    class COM


        public string readstring()
        {
           
            do
            {

                    ReadData = comport.ReadLine();
                    char[] delimiterChars = { ',' };
                    string[] words = ReadData.Split(delimiterChars);
                    data = words[0];
                    ReadData = "";

               
            }
            while (data != "PA1");  // Hvordan stopper jeg denne while ved click på Button2?

            return ReadData;

        }
Avatar billede platik Nybegynder
16. september 2011 - 11:46 #1
hvad med at lave endnu en prop?

while (data != "PA1" && isRunning);

Og ved button2 click

IsRunning = false;
Avatar billede olesen85 Nybegynder
16. september 2011 - 12:39 #2
dur ikke da form 1 ikke er aktiv da whilen køre i en anden class
Avatar billede bvli Praktikant
16. september 2011 - 12:44 #3
Jeg tror faktisk det bliver svært for dig, at komme til at trykke på button2, da du blokerer hele gui-tråden med dine while-løkker.

At du kalder Application.DoEvents() er en grim nødløsning, og selv hvis det kommer til at virke, vil det ikke blive en stabil løsning.

Dine while-løkker skal køre i en anden tråd (eller du kan alternativt bruge events fra din com-port). Men prøv at google på BackgroundWorker, og se hvordan du kan få noget til at køre i baggrunden, og alligevel være cancelable.
Avatar billede platik Nybegynder
16. september 2011 - 12:54 #4
Giver ikke rigtig mening.

Hvis den ikke er aktiv kan du ikke trykke på knappen?

Af hvad jeg lige kan se kører du også alt i samme tråd.
Start evt. en ny tråd som kører metoden i COM klassen?
Avatar billede montago Praktikant
18. september 2011 - 15:21 #5
Sådan her laver man baggrundstråde i ASP.NET:
- Tråden er statisk så alle der besøger siden kan se den
- Du snakker med tråden via en statisk struct/class/instans
- Du henter information ud på frontend med java script:
    page.aspx?GetWorkerStatus=1
- for at stoppe en tråd som løber løbsk, brug IISRESET
- hver gang du compiler bliver tråden også resettet hvis du debugger på IIS eller Studio serveren.

-----------------------------

//din baggrundstråd
static Thread BGWorker;
static bool isRunning = false;
static struct ThreadInfo
{
    string Information; //brug denne variabel til at snakke med tråden
    int tal; //brug dette tal til at snakke med tråden
}

protected void Page_Init(object sender, EventArgs e)
{
    if (BGWorker == null)
    {
        BGWorker = new Thread(new ThreadStart(BGWorker_DoWork));
        BGWorker.IsBackground = true;
        BGWorker.Start();
    }
}

protected void Page_Load(object sender, EventArgs e)
{
    if (Request["GetWorkerStatus"] != null)
    {
        Response.Clear();
        Response.Write(WorkState());
        Response.Flush();
        Response.End();
        return;
    }
}

private void start_but_Click(object sender, EventArgs e)
{
/*
    button2.Visible = true;
    start_but.Visible = false;
   
    com.ReadOptions();
    com.openport();
    access.ReadOptions();
    access.opencon();
*/
    isRunning = true;
}

public void button2_Click(object sender, EventArgs e)
{
    isRunning = false;
}

private string WorkState()
{
    /* Skriv/læs information fra tråden
        ThreadInfo.tal;
        ThreadInfo.Information
    */

    string html = "Status: " //+ Statiske variable info...

    return html;
}

private void BGWorker_DoWork()
{
    while (true)
    {
        if(isRunning)
        {
            /* Skriv/læs information fra tråden
           
            ThreadInfo.tal;
            ThreadInfo.Information
            */
        }
        else
        {
            Thread.Sleep(1000);
        }
    }
}
Avatar billede montago Praktikant
18. september 2011 - 15:24 #6
btw... husk at bruge Thread.Sleep() i loops så du ikke blokere serveren totalt...
Avatar billede olesen85 Nybegynder
19. september 2011 - 07:37 #7
Montago det er ikke nogen ASP.net side jeg laver det er et windows form projekt
Avatar billede montago Praktikant
19. september 2011 - 09:05 #8
Det er sådan set underordnet... du kan stadig bruge Tråd-programmering til at gøre din app bedre og sørge for at den ikke låser GUI...
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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