0

私がする必要があるのは、呼び出された1つのメソッドからforeach値を取得しprivate void ReceiveData()、それらを別のメソッドに送信することvoid Update()です。C#でそれを行う方法は?

private void ReceiveData() 
    {

       IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("10.0.2.217"), port);
       client = new UdpClient(remoteIP);
        while (true) 
        {
           try 
            {
                IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
                data = client.Receive(ref anyIP);

                int nIndex = 0;
                foreach(SignalIndex si in xmlreader.cdpSignals)
                {
                     x= ReadSingleBigEndian(data, si.index + 0);
                     y= ReadSingleBigEndian(data, si.index + 4);
                     z= ReadSingleBigEndian(data, si.index + 8);
                     alpha= ReadSingleBigEndian(data, si.index + 12);
                     theta= ReadSingleBigEndian(data, si.index + 16);
                     phi= ReadSingleBigEndian(data, si.index + 20);

                //  xmlreader.unityGameObjects[nIndex].transform.localPosition = new Vector3(x,y,z);
                //  xmlreader.unityGameObjects[nIndex].transform.Rotate(alpha,theta,phi);   
                }

            }
            catch (Exception err) 
            {
               print(err.ToString());
            }

        }

        client.Close();
    }


    void Update() 
    {
        foreach(GameObject go in xmlreader.unityGameObjects)
        {
            go.transform.localPosition = new Vector3(x,y,z);
            go.transform.transform.Rotate(alpha,theta,phi);
        }
    }

2つのメソッドがあり、ReceiveData()からforeachの値を取得し、Update()メソッドでインスタンス化する必要があります。ReceiveData()からのforeachのすべての変数はパブリックですが、Update()ではすべて0を取ります。

4

2 に答える 2

0

foreachの動作方法は次のとおりです。

メソッド(ReceiveData)では、ある種のメソッドをループします。次に、そのループから他のメソッド()を呼び出すことができますUpdate。ただし、これらの変数を渡す必要があります。現在、メソッドは無効であり、引数はありません。

私は次のことを提案します:

private void ReceiveData()
{
    var data = GetMyDataFromSomewhere(); // data should be an IEnumerable of some sort

    foreach (MyDataItemType dataItem in data)
    {
        Update(dataItem);
    }
}

private void UpdateData(MyDataItemType dataItem)
{
    // Do some update to dataItem here...
}

より多くのコードで新しい更新を行った後、使用できる情報がいくつかあります。明らかに、クラス( x、、、など)にいくつかのフィールド/プロパティを設定しています。そして、updateメソッドはそれらを使用して何かを更新します。yz

Update()次に、ループ内から呼び出すかforeach、設定後にのみ実行する必要がある場合はループの後で呼び出すのはなぜですか。

foreach(SignalIndex si in xmlreader.cdpSignals)
{
    x= ReadSingleBigEndian(data, si.index + 0);
    y= ReadSingleBigEndian(data, si.index + 4);
    z= ReadSingleBigEndian(data, si.index + 8);
    alpha= ReadSingleBigEndian(data, si.index + 12);
    theta= ReadSingleBigEndian(data, si.index + 16);
    phi= ReadSingleBigEndian(data, si.index + 20);

    UpdateData(); // Just call it!
}
于 2012-11-22T13:41:05.430 に答える
0

編集2:

ReaderWriterLockSlimのドキュメント:http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx

struct CoordData
{
    public float X, Y, Z, Alpha, Theta, Phi;
    public int NIndex;
}

private List<CoordData> coordDataList = new List<CoordData>();
private ReaderWriterLockSlim lockObj = new ReaderWriterLockSlim();

private void ReceiveData() 
{

   IPEndPoint remoteIP = new IPEndPoint(IPAddress.Parse("10.0.2.217"), port);
   client = new UdpClient(remoteIP);
    while (true) 
    {
       try 
        {
            IPEndPoint anyIP = new IPEndPoint(IPAddress.Any, 0);
            data = client.Receive(ref anyIP);

            int nIndex = 0;
            foreach(SignalIndex si in xmlreader.cdpSignals)
            {
                 x= ReadSingleBigEndian(data, si.index + 0);
                 y= ReadSingleBigEndian(data, si.index + 4);
                 z= ReadSingleBigEndian(data, si.index + 8);
                 alpha= ReadSingleBigEndian(data, si.index + 12);
                 theta= ReadSingleBigEndian(data, si.index + 16);
                 phi= ReadSingleBigEndian(data, si.index + 20);

                 lockObj.EnterWriteLock();
                 try
                 {
                     coordDataList.Add(new CoordData() { X = x, Y = y, Z = z, Alpha = alpha, Theta = theta, Phi = phi, NIndex = nIndex });
                 }
                 finally
                 {
                     lockObj.ExitWriteLock();
                 }

                 nIndex++; //I'm assuming you want to do this here otherwise you'll be changing the same object in the array every time  
            }

        }
        catch (Exception err) 
        {
           print(err.ToString());
        }

    }

    client.Close();
}

void Update()
{
    lockObj.EnterReadLock();
    try
    {
        foreach (CoordData data in coordDataList)
        {
            xmlReader.unityGameObjects[data.NIndex].localPosition = new Vector3(data.X,data.Y,data.Z);
            xmlReader.unityGameObjects[data.NIndex].Rotate(data.Alpha,data.Theta,data.Phi);
        }
    }
    finally
    {
        lockObj.ExitReadLock();
    }
}
于 2012-11-22T13:44:23.970 に答える