Aquarius-Michael
@Aquarius-Michael
Программист и железячник

Как передать данные в работающий поток?

У меня есть поток, который бесконечно работает в цикле. Но возникла одна проблема. Не могу передать потоку периодически загружаемые данные. Пробовал делегаты. Бесполезно.
public void Thread()
        {
            GetMessage msg = new GetMessage(Fail);
            GetCommands val = new GetCommands(Check);

            Ядро_хххх.BasicStructures.Command cmds = new Ядро_хххх.BasicStructures.Command();

            do
            {
                #region Стадия записи.

                if (cmd.Count > 0) cmds = cmd.ElementAt(0);

                cmd.TryDequeue(out cmds); // в пределах класса копится, но здесь остаётся пустым

                if (Device.CheckTxWaiting(ref numBytesWritten))
                    if (Commands.HasFlag(Ядро_хххх.BasicStructures.Command.NotOperation))
                    {
                        Device.Write(хххх.Upload(Outbox, Ядро_хххх.BasicStructures.Command.NotOperation), ref numBytesWritten);
                        IsButton = false;
                        RevisionTxFail = 0;
                    }
                    else
                    {
                        if (Commands.HasFlag(Ядро_хххх.BasicStructures.Command.LoadFPGAAll))
                        {
                            Device.Write(хххх.Upload(Outbox, Ядро_хххх.BasicStructures.Command.LoadFPGAAll), ref numBytesWritten);
                            //Commands = Ядро_хххх.BasicStructures.Command.NotOperation;
                        }
                        else
                        {
                            RevisionTxFail += 1;
                            if (RevisionTxFail > 1000) msg(5);
                        }
                    }
                #endregion

                #region Стадия чтения.
                if (Device.CheckRxQueue(ref numBytesAvailable))
                {
                    Device.Read(numBytesAvailable, ref ReadData, ref numBytesRead);
                    Inbox = хххх.Download(ReadData);
                    RevisionRxFail = 0;
                }
                else
                {
                    RevisionRxFail += 1;
                    if (RevisionRxFail > 1000) msg(5);
                }
                #endregion
            } while (IsWorking); // стоит всегда true, пока msg не изменит в значение false, в идеальном случае здесь всегда стоит true
            //логика для работы с приёмом и передачей
        }
  • Вопрос задан
  • 219 просмотров
Решения вопроса 1
DarkRaven
@DarkRaven
разработка программного обеспечения
А поле, через которое вы пихаете данные, оно volatile? Может это поможет?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
petermzg
@petermzg
Самый лучший программист
А чем ConcurrentQueue не угодил?
Enqueue(T) - добавили, где данные загрузили
TryDequeue(T) - получили в потоке для обработки
Ответ написан
WNeZRoS
@WNeZRoS
Вы создаёте cmds в потоке и никуда не передаёте? Как тогда там может что-то появиться?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы