Hallo,
ich habe derzeit ein kleines Problem mit der RichTextBox.
Ich gebe in der RichTextBox im Interwall von x millisekunden alle Wörter eines arrays nach und nach aus, dies funktioniert einwandfrei.
Der Text ist auf Zentriert gesetzt springt jedoch bei der Ausgabe hin und her.
Beispiel:
Soll:
[Zentriert]Wort1
[Zentriert]Wort2
[Zentriert]Wort3
[Zentriert]Wort4
[Zentriert]Wort5
Ist:
[Zentriert]Wort1
[Linksbuendig]Wort2
[Zentriert]Wort2
[Zentriert]Wort3
[Zentriert]Wort4
[Linksbuendig]Wort5
[Zentriert]Wort5
Welches der Wörter nun sein Alignment auf linksbündig änder ist bei jedem Durchlauf unterschiedlich, meistens sieht man das Wort auch nur einen Bruchteil einer Sekunde und danach ist es wieder mittig zentriert. Weiß da jemand rat ?
Hier mein Programm-Code (lyncht mich bitte nicht für eventuelle unsaubere Formatierung oder Programmierung 😉)
//############### Der bgWorker macht seinen Job ;) ####################
private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
//Variablen deklarieren
string text;
string[] words;
int initialcount = Convert.ToInt32(TB_Temp_InitialCount.Text);
int wordscount;
int wordlenght;
int wordlenght2;
//Einlesen der Datei in string text
System.IO.StreamReader file = new System.IO.StreamReader(TB_Temp_Pfad.Text, Encoding.Default);
text = file.ReadToEnd();
//Spliten der Textdatei
words = text.Split(' ','\n');
//Zählen der Anzahl der Elemente
wordscount = words.Count();
//Einstellen der Progressbar minimal und maximal Werte
PB_Main.Minimum = 0;
PB_Main.Maximum = wordscount;
while (initialcount <= wordscount)
{
//wenn Stoptaste betaetigt wurde
if ((bgWorker.CancellationPending == true))
{
e.Cancel = true;
break;
}
//Definieren erneuerbarer Variablen
TB_Temp_InitialCount.Text = Convert.ToString(initialcount);
TB_Temp_TextLenght.Text = Convert.ToString(wordscount);
//Wenn initialcount mit wordocunt uebereinstimmt
if (initialcount == wordscount)
{
//Wenn bgWorker abgebrochen wurde
if (bgWorker.WorkerSupportsCancellation == true)
{
bgWorker.CancelAsync();
BT_StartStop.Text = "Start";
BT_StartStop.BackColor = Color.Green;
BT_StartStop.Enabled = false;
}
}
//Wenn initialcount nicht mit wordcount uebereinstimmt
else
{
//Ausgeben des aktuellen Wort indexes
RTB_Main2.SelectionAlignment = HorizontalAlignment.Center;
RTB_Main2.Text = words[initialcount];
RTB_Main2.SelectionAlignment = HorizontalAlignment.Center;
//Einstellen des aktuellen Wertes des Progressbar
PB_Main.Value = initialcount;
PB_Main.Update();
//Auslesen der Wortlaenge
wordlenght2 = words[initialcount].Length;
wordlenght = wordlenght2 - 5;
//Wenn Wortlaenge kleiner 0
if (wordlenght >= 0)
{
System.Threading.Thread.Sleep(TB_Geschwindigkeit.Value + (wordlenght * 20));
}
//Wenn Wortlaenge groesser 0
else
{
//Wenn Geschwindigkeit - wordlenght * 20 kleiner 0
if (TB_Geschwindigkeit.Value - (wordlenght * 20) <= 0)
{
System.Threading.Thread.Sleep(TB_Geschwindigkeit.Value);
}
//Wenn Geschwindigkeit - wordlenght * 20 groesser 0
else
{
System.Threading.Thread.Sleep(TB_Geschwindigkeit.Value - (wordlenght * 20));
}
}
initialcount++;
}
}
file.Close();
You must be careful not to manipulate any user-interface objects in your DoWork event handler. Instead, communicate to the user interface through the BackgroundWorker events.
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hallo Kreater,
CheckForIllegalCrossThreadCalls = false;
Dies ist eindeutig die falsche Herangehensweise, um Multithreading-Programme zu schreiben.
Innerhalb der BackgroundWorker.DoWork-EventMethode darfst du nicht direkt auf GUI-Elemente zugreifen - Punkt!
Verwende entweder das BackgroundWorker.ProgressChanged-Ereignis (welches innerhalb des GUI-Threads läuft) oder aber benutze [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).