Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Threads og prioriteter i C#

2 views
Skip to first unread message

Ulrik Smed

unread,
Oct 9, 2011, 6:43:33 AM10/9/11
to
Hej

Jeg koder lidt p� min spectrumanalyser. Den sampler lyd fra lydkortet og
tegner et scop og en FFT. For at f� scopet til at opdatere hurtigt og
flydende, sampler jeg en ret lille blok (lad os kalde det en frame) ad
gangen og tegner den som scop. Frames'ene samler jeg sammen i en st�rre
buffer og k�rer en FFT p� den engang imellem.

Denne FFT og grafiktegning (plus scop i samme frame) kan tage l�ngere tid
end tiden mellem de enkelte frames, s� jeg har sat en backgroundworker op
til at beregne og tegne grafik, for ikke at miste frames. Men den crasher
nogle gange (InvalidOperationExeption) fordi de pictureboxe den tegner i er
oprettet i mainformen, og backgroundworkeren er en anden tr�d.

Det ville nok v�re smartere hvis samplingen k�rte i en anden tr�d i stedet
for beregning og tegning. Men s� skal backgroundworkeren have prioritet over
main, ellers mister jeg jo alligevel frames. Samplingen bliver trigget af et
'dataarrived' event hver gang en frame er klar, og kopierer bare en buffer,
s� den tager ikke lang tid.

Kan man p� en nem m�de �ndre prioriteten af en backgroundworker, eller skal
man over i noget 'rigtig' flertr�dsteknik? Kan se framework 4 har nogle
ekstra ting at tilbyde p� det punkt.

--
Ulrik Smed
Aarhus


Max Stagsted

unread,
Oct 28, 2011, 7:57:49 PM10/28/11
to


"Ulrik Smed" skrev i meddelelsen
news:4e917ad9$0$293$1472...@news.sunsite.dk...
Din backgroundworker m� ikke r�re ved dit ui, det er kun ui-tr�den der m�
det. Se
f.eks. http://www.dotnetperls.com/progressbar for et simpelt eksempel p�
hvordan man kommer omkring det problem. Princippet er at baggrundstr�den
"signalerer" at den har noget der skal opdateres og en metode k�rt af
ui-tr�den
foretager s� opdateringen. Mit g�t er din l�sning ikke skal rettes s�rlig
meget for at k�re, men sv�rt uden at se koden.

--
Max
Ikast

Arne Vajhøj

unread,
Oct 30, 2011, 9:17:45 PM10/30/11
to
En helt separat tr�d kan godt opdatere GUI bare den bruger Invoke.

Kode snippet:

if(textBox1.InvokeRequired)
{
textBox1.Invoke((MethodInvoker)delegate() { AppendTextBox1(msg); });
}
else
{
AppendTextBox1(msg);
}

Arne



Ulrik Smed

unread,
Nov 7, 2011, 5:57:16 PM11/7/11
to
Arne Vajhøj wrote:
> On 10/9/2011 6:43 AM, Ulrik Smed wrote:

>> Kan man på en nem måde ændre prioriteten af en backgroundworker,
>> eller skal man over i noget 'rigtig' flertrådsteknik? Kan se
>> framework 4 har nogle ekstra ting at tilbyde på det punkt.
>
> En helt separat tråd kan godt opdatere GUI bare den bruger Invoke.
>
> Kode snippet:
>
> if(textBox1.InvokeRequired)
> {
> textBox1.Invoke((MethodInvoker)delegate() { AppendTextBox1(msg);
> }); }
> else
> {
> AppendTextBox1(msg);
> }
>
> Arne

Takker for svaret, begge to. Jeg har fået det med invoke til at virke og
omstruktureret lidt.

--
Ulrik Smed
Aarhus


0 new messages