1

コンピューターのマイク入力で音の周波数をカウントする C# でスレッドを作成したいと思います。FFT アルゴリズムについてではなく、Thread.hz の変更中に A.hz フィールドを変更できるようにスレッドを開始する方法について質問しています。

スレッドは 1 つだけになります。

public class A()
{
    Thread t;
    int hz;  <-- i would like to change this when

    A()
    {
        starts Thread
        onchange t.hz modifies and dispays this.hz
    }        
}

class Thread
{
    int hz; <-- this changes

    void computeFrequency() <-- because of that method
    {
        changesHZField...
    }
}
4

3 に答える 3

2

約束どおり、Rx を使用したソリューションを次に示します。

using System;
using System.Reactive.Concurrency;
using System.Reactive.Linq;

namespace rxtest
{
    class FrequencyMeter
    {
        Random rand = new Random();
        public int Hz
        {
            get
            {
                return 60+rand.Next(3);
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var obs = Observable.Generate<FrequencyMeter, int>(
                new FrequencyMeter(), //state
                x => !Console.KeyAvailable, // while no key is pressed
                x => x, // no change in the state
                x => x.Hz, // how to get the value
                x => TimeSpan.FromMilliseconds(250), //how often
                Scheduler.Default)
                .DistinctUntilChanged() //show only when changed
                ;

            using (IDisposable handle = obs.Subscribe(x => Console.WriteLine(x)))
            {
                var ticks = Observable.Interval(TimeSpan.FromSeconds(1)).Subscribe(x=>Console.WriteLine("tick")); //an example only
                Console.WriteLine("Interrupt with a keypress");
                Console.ReadKey();
            }
        }
    }
}

値の非同期配信:

Interrupt with a keypress
60
61
tick
62
60
tick
61
60
tick
62
61
tick
62
60
tick
于 2012-11-15T18:47:43.440 に答える
1

特別なことをする必要はありません。複数のスレッドがhzフィールドにアクセスできます。同期の問題を考慮する必要があります (http://msdn.microsoft.com/en-us/library/ms173179.aspx)

複数のスレッドが同じ変数を読み書きしている場合、あらゆる種類の問題があります。おそらく最も簡単な方法は、リンクをたどってロック方法をコピーすることです。

于 2012-11-14T15:55:16.997 に答える
0
public class A()
{
    Thread t;
    int hz;

    A()
    {
        //starts Thread
    }

    internal void Signal(int hz){
        //modifies and dispays this.hz
    }

}

これで、Thread クラスは、プロパティが設定されるたびに Signal メソッドを呼び出すことができます。A クラス インスタンスを参照するには、それを Thread クラス コンストラクターに渡し、参照をプライベート変数として格納するか、A 自体を static として宣言します。これは、全体的なアーキテクチャによって異なります。

class MyThread : Thread
{
    int _hz;
    A _instance;

    public void MyThread(A inst){
        _instance = inst;
    }

    void computeFrequency()
    {
        //changesHZField...
        _instance.Signal(_hz);
    }
}

最後に、A クラスと MyThread クラスで行っていることによっては、クロス スレッド操作を有効にする必要がある場合があります。

于 2012-11-14T16:07:06.617 に答える