0

リストにあるすべてのアイテムの FIFO キューを作成したいと考えています。キューからリストの項目を取得する必要があります。

これは私のコードです:

using System.Collections.Generic;

namespace CHPCanControl
{
  public class signals
 {
    public double quant;
    public int Ind;
    public int Subin;
    public int Control;
    public int dat;
    public List<signals> signalList;

    public signals(double quant, int Ind, int Subin, int Control, int dat)
    {

        this.quant = quant;
        this.Ind = Ind;
        this.Control = Control;
        this.Subin = Subin;
        this.dat = dat;
    }
 }

 public class Controlsignal 
{
   public List<signals> signalList = new List<signals>(); // this is my first list

    public void main()
    {
        signalList.Add(new signals(1, 1000, 1, 0x60, 1));
        signalList.Add(new signals(1, 1000, 2, 0x60, 1));
        signalList.Add(new signals(1, 1000, 3, 0x60, 1));
        signalList.Add(new signals(1, 1000, 4, 0x60, 1));
        signalList.Add(new signals(0.5, 1000, 5, 0x60, 200));
        signalList.Add(new signals(1, 1000, 6, 0x60, 1));
        signalList.Add(new signals(1, 1000, 7, 0x60, 1));
        signalList.Add(new signals(0.0625, 1000, 8, 0x60, 1));
        signalList.Add(new signals(0.1, 1000, 9, 0x60, 1));
        signalList.Add(new signals(0.1, 1000, 10, 0x60, 1));
    }
  }

   public class Statussignal
{
   public List<signals> signalList1 = new List<signals>(); // this is my second list

    public void main()
    {
        signalList1.Add(new signals(1, 1100, 1, 0x40, 1));
        signalList1.Add(new signals(1, 1100, 2, 0x40, 1));
        signalList1.Add(new signals(1, 1100, 3, 0x40, 1));
        signalList1.Add(new signals(0.0002, 1100, 4, 0x40, 1));
        signalList1.Add(new signals(0.5, 1100, 5, 0x40, 200));
        signalList1.Add(new signals(1, 1100, 6, 0x40, 1));
        signalList1.Add(new signals(1, 1100, 7, 0x40, 1));
        signalList1.Add(new signals(1, 1100, 8, 0x40, 1));
    }
  }
 }

私の問題は、両方のリストの項目を FIFO キューに追加したいということです。複数のスレッドからキューにアクセスする必要があるかもしれないと考えています。

私はこの方法でやろうとしている返信をありがとうございますが、それが正しいかどうかはわかりません..

  using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Data;
  using System.Drawing;
  using System.Linq;
  using System.Text;
  using System.IO;
  using System.Windows.Forms;
  using System.Text.RegularExpressions;
  using System.Threading;


 namespace CHPCanControl
{
public partial class Form1 : Form
{

    Controlsignal control = new Controlsignal();
    Statussignal status = new Statussignal();
    Calibrationparameters calibration = new Calibrationparameters();


    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        // need to do something here by which you will receieve 
        // your messages here from the ECU

        Thread thread = new Thread(new ThreadStart(this.ECU_Send));
        thread.Start();
        thread.IsBackground = true;

    }
    public void ECU_Send()
    {
        private Queue<control.signalList> queue = new Queue<control.signalList>();
        public event EventHandler Changed;
        protected virtual void OnChanged()
        {
            if(Changed != null)
            {
                Changed(this,EventArgs.Empty);
            }
        }
    public int Count { get { return queue.Count; } }

    public virtual void Enqueue(control.signalList item)
    {
        queue.Enqueue(item);
            OnChanged();
    }


    public virtual void Dequeue()
    {
       control.signalList item = queue.Dequeue();
        OnChanged();
        return item;
    }
   }
  }
4

2 に答える 2

2
  • FIFO の場合は、Queue<T>.
  • LIFO の場合は、Stack<T>.

コレクションなどの詳細はこちら

.NET 4 以上を使用している場合はConcurrentQueue<T>こちらを参照してください。.NET 3.5 以下を使用している場合は、スレッド セーフのためにSynchronize the queue を使用できます。すばらしい例がここにあります。

using System;
using System.Collections;
public class SamplesQueue  {

   public static void Main()  {

      // Creates and initializes a new Queue.
      Queue myQ = new Queue();
      myQ.Enqueue( "The" );
      myQ.Enqueue( "quick" );
      myQ.Enqueue( "brown" );
      myQ.Enqueue( "fox" );

      // Creates a synchronized wrapper around the Queue.
      Queue mySyncdQ = Queue.Synchronized( myQ );

      // Displays the sychronization status of both Queues.
      Console.WriteLine( "myQ is {0}.", myQ.IsSynchronized ? "synchronized" : "not synchronized" );
      Console.WriteLine( "mySyncdQ is {0}.", mySyncdQ.IsSynchronized ? "synchronized" : "not synchronized" );
   }
}
/* 
This code produces the following output.

myQ is not synchronized.
mySyncdQ is synchronized.
*/
于 2012-12-17T15:22:37.217 に答える
0

使いたいだけのようですIEnumerable。これは、読み取り専用インターフェイスを介してリストからすべてのアイテムを読み取る方法です。ConcatLINQで使用しIEnumerableて、両方のリストのアイテムを表すを取得できます。

ただし、スレッドセーフではないため、複数のスレッドからキューにアクセスする場合は、デフォルトでをラップするIEnumerableを使用することをお勧めします。次に、両方のリストのすべてのアイテムをキューに追加して、任意の数のスレッドから読み取ることができます。BlockingCollectionConcurrentQueue

于 2012-12-17T15:32:50.770 に答える