LabWindows: реализация потоковобезопасных очередей, которые могут обрабатывать строковые элементы

У меня есть сервер Labwindows, который прослушивает данные от клиента Python на удаленной машине. На сервере Labwindows всякий раз, когда вызывается событие TCP_DATAREADY, я считываю буфер для получения данных от клиента. На данный момент мне нужно проанализировать данные и обновить элементы управления пользовательского интерфейса. Однако, поскольку данные поступают часто, лучше, если я смогу поручить задачу анализа данных и обновления элементов управления пользовательским интерфейсом для другого потока, чтобы сервер не потерял данные от клиента.

Я думал об использовании потоковобезопасных очередей в Labwindows. Однако данные, которые я получаю от клиента, являются строкой. Как мне построить очередь, в которой есть строковые элементы? Я не могу использовать указатели, так как данные, полученные от клиента, обновляются каждый раз, когда поступают данные.

Вот фрагмент кода, который читает данные из сокета:

case TCP_DATAREADY:
            if ((dataSize = ServerTCPRead (g_hconversation, receiveBuf,
                                           dataSize, 1000))
                < 0)
                {
                SetCtrlVal(g_hconversation, MAINPNL_TEXTBOX,"Receive Error");
        }
            else
                {
        //receiveBuff should be passed to function that decides where to display it
        display_value_from_client(receiveBuf);

                }

Таким образом, receiveBuf постоянно меняется, и сохранение указателей на него в очереди не поможет. Как мне реализовать здесь многопоточность, чтобы мои потоки заботились о функциональности синтаксического анализа, и мне нужно только беспокоиться о чтении данных из сокета в основном потоке?

1 ответ

Решение

"Классический" способ выполнения таких межпотоковых коммуникаций состоит в том, чтобы распределить по маске receiveBuf, поставить в очередь указатель буфера после получения данных и немедленно распределить другой буфер приема для следующей загрузки данных. Вы можете освободить указатели буфера после обработки их в графическом интерфейсе.

Такой подход означает, что пользовательский интерфейс и сетевые потоки никогда не работают в одном и том же буфере и поэтому могут работать независимо.

Другие вопросы по тегам