我想在C#中创建一个Thread,它将计算计算机麦克风输入端的声音频率。我不是在询问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...
}
}
答案 0 :(得分: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
答案 1 :(得分:1)
您无需执行任何特殊操作 - 多个线程将能够访问您的hz
字段。您需要考虑同步问题(http://msdn.microsoft.com/en-us/library/ms173179.aspx)
当你有多个线程读/写同一个变量时,会出现各种各样的问题。最简单的事情可能是遵循链接并复制他们的锁定方法。
答案 2 :(得分: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类中执行的操作