Toon posts:

[C#] Threads en synchronisatie

Pagina: 1
Acties:

Verwijderd

Topicstarter
Na een succesvol verloop van de variabele vraag (mijn dank hiervoor :) ) ben ik met threads aan de slag gegaan.

([rml][ C#] Variabele in form2 zichtbaar maken.[/rml])

Nu is dit op zich niet zo'n probleem (staat genoeg info in mijn boek en op het web). Maar één vraag die onbeantwoord blijft:

Moet de data die een thread in een richTextbox (bijvoorbeeld) zet synchroniseren. In delphi7 moest dit namelijk wel (in de meeste gevallen).

Is deze manier die ik nu toepas goed of kan dit problemen gaan opleveren wanneer ik de text in de richTextBox wil zetten?

Note: Ik heb niet over multi threading.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private void button2_Click(object sender, System.EventArgs e)
{
    if (t1 == null || t1.IsAlive != true)
                {
        t1 = new Thread(new ThreadStart(Counter));
        t1.Start();
    }
    else
    {
        t1.Abort();
        richTextBox1.AppendText("\nThread aborted!");
    }
}

public void Counter()
{
    string text1 = "";
    string text2 = "";
    ushort u = 0;
    while (u <= 20000)//ushort.MaxValue
    {
        text1 = "\n" + u.ToString();
        text2 = string.Concat(text2,text1);
        u++;
    }
    richTextBox1.MaxLength = int.MaxValue;
    richTextBox1.AppendText(text2);
}

[ Voor 7% gewijzigd door Verwijderd op 27-01-2004 14:01 ]


  • Infinitive
  • Registratie: Maart 2001
  • Laatst online: 25-09-2023
Voor de meeste controls geldt dat je alleen vanuit de 'message thread' aanroepen op methoden mag doen. Dus dan mag het dus niet op de manier zoals je nu hebt neergezet. Er zijn uiteraard manieren voor om code in die thread uit te voeren en dat kan je in de platvorm documentatie vinden.

Alternatief is door gebruik te maken van een timer. Dat zit je meteen in de juiste thread en bovendien hoef je dan geen threads the maken of the starten.

putStr $ map (x -> chr $ round $ 21/2 * x^3 - 92 * x^2 + 503/2 * x - 105) [1..4]


Verwijderd

Gebruik in dit geval:

code:
1
2
3
if (richTextBox1.InvokeRequired) {
  richTextBox1.Invoke(delegateThatDoesTheJob);
}


Anders kan je raar gedrag krijgen.