Toon posts:

[C#] RTF in richTextBox invoeren bevriest programma.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een programma dat bepaalde tekst inleest en dit omzet naar rtf. Dit gebeurt in een thread. Als deze klaar is geeft hij de data door via een delegate naar een method die de data naar de richTextBox kopieert.

Maar als het om een groot bestand gaat (600kb) dan duurt het wat langer voordat de richTextBox klaar is. Als er dan in het programma geklikt wordt komt de melding "Not responding..".

Hoe kan ik dit voorkomen?

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

Laat de processing in een aparte thread doen, zodat je hoofdthread 'vrij' blijft? Maar 600kb omzetten naar RTF; dat kan best een groot bestand worden, dus het verbaasd me niet dat dit enige tijd kan duren.

Geen idee of je trouwens iets van preprocessing kan doen in een aparte RichtTextBoxcontrol in die andere thread, en dan alleen het resultaat kopieren naar de RTB in de hoofdthread.

[ Voor 80% gewijzigd door gorgi_19 op 22-02-2004 22:45 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
Het vervelende is dat waar ik dit ook neer zet (richTextBox1.Rtf = (S); ) het altijd in de hoofdthread wordt uitgevoerd.

Het enige waar ik dan nog aan kan denken is "S" in blokken te verdelen en dan in de tussenliggende stukken Application.DoEvents(); aan te roepen.

Een Monitor helpt mij denk ik ook niet veel omdat als de routine (richTextBox1.Rtf = (S); ) eenmaal gestart is niet meer gepauseerd kan worden (of is dit verkeerd beredeneerd?).

edit:

Of een systeemvereisten tabel meeleveren:
400kb = 1800MHz
800kb = 3600MHz
:9~

[ Voor 12% gewijzigd door Verwijderd op 22-02-2004 23:31 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:40
Zet in je 'workerthread' een kleine sleep, zodat die thread niet voortdurend de resources in beslag neemt, en je UI thread ook even tijd krijgt:

code:
1
2
3
4
5
6
while( !FinishedInlezen )
{
   ....
   System.Threading.Thread.Sleep(100);
 
}

[ Voor 27% gewijzigd door whoami op 23-02-2004 10:42 ]

https://fgheysels.github.io/


Verwijderd

Not responding wil zeggen dar je gui thread te hard bezig is.
En aangezien het maar 1 call is waarin hij veel doet kan je geen DoEvents gebruiken.
De vraag is of het zo lang duurt om de data in te lezen, of dat je box zo lang bezig is.

Tips:
- Gebruik ThreadPool.QueueUserWorkItem(WaitCallBack) om je data in te lezen,
dan heeft je gui thread daar geen last van.

- Gebruik Control.Invoke om je box door de gui thread te laten updaten.
Dit mag je niet in een andere thread doen. Dan kan je rare problemen krijgen.

[ Voor 6% gewijzigd door Verwijderd op 23-02-2004 11:27 ]