У меня есть тупик? Стоит ли вместо этого использовать кольцевой буфер с очередями?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 У меня есть тупик? Стоит ли вместо этого использовать кольцевой буфер с очередями?

Сообщение Anonymous »

Цель Asyncquery состоит в том, чтобы принять новые сообщения WSTRING как можно быстрее и «потреблять» их, отправив их на управляемую функцию (которая может быть медленной, потому что это происходит в потоке пользовательского интерфейса).
у меня есть следующая реализация, которая блокирует (тесты не закончатся), и я не понимаю, почему и как это исправить. < /p>
Кроме того, я не уверен, что Лучшая реализация, я подумал о кольцевом буфере с двумя std :: queue чередуются, поэтому, пока 1 питается, 2 потребляются, избегая блоков, но я все еще Нужна переменная условия и дождитесь случая, когда отмечается потребление. /> Delcarations: < /p>
#pragma once
#include
#include
typedef void(__stdcall* MessageChangedCallback)(const wchar_t* string);

class __declspec(dllexport) AsyncQuery
{
protected:
mutable std::mutex _mtx;
std::condition_variable _cv;
bool _run{ true };
std::queue _messages{};
MessageChangedCallback _log{};
int _count{};
std::thread _threadCall;
public:

AsyncQuery(MessageChangedCallback fn);
~AsyncQuery();
void Add(std::wstring msg);
void CallRunner();
int Count();
};
< /code>
Определения: < /p>
#include "pch.h"
#include "AsyncQuery.h"

AsyncQuery::AsyncQuery(MessageChangedCallback fn)
: _log(fn), _threadCall([&] { CallRunner(); })
{
}

AsyncQuery::~AsyncQuery()
{
_run = false;
_threadCall.join();
}

void AsyncQuery::Add(std::wstring msg)
{
std::lock_guard addLock(_mtx);
_messages.push(msg);
_cv.notify_one();
}

void AsyncQuery::CallRunner()
{
while (_run)
{
std::unique_lock readPopLock(_mtx);
_cv.wait(readPopLock, [this] { return !_messages.empty(); });
auto msg = _messages.front();
_messages.pop();
readPopLock.unlock();
_log(msg.c_str());
_count++;
}
}

int AsyncQuery::Count()
{
return _count;
}
< /code>
tests: < /p>
static MessageChangedCallback log = [](const wchar_t* z)
{
Logger::WriteMessage(z);
};
static MessageChangedCallback logDelay = [](const wchar_t* z)
{
Sleep(10);
Logger::WriteMessage(z);
};

TEST_CLASS(AsyncQueryTests)
{
public:

TEST_METHOD(AddTest)
{
AsyncQuery sut(log);

for (int i = 0; i < 10; ++i)
{
std::wstringstream wstr{};
wstr

Подробнее здесь: https://stackoverflow.com/questions/794 ... es-instead
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Существует ли библиотека C++, реализующая кольцевой буфер массивов динамического размера? [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous
  • Ошибка «Кольцевой буфер RX заполнен» в PySerial, несмотря на очистку буферов
    Anonymous » » в форуме Python
    0 Ответы
    27 Просмотры
    Последнее сообщение Anonymous
  • Кольцевой буфер в Java
    Anonymous » » в форуме JAVA
    0 Ответы
    19 Просмотры
    Последнее сообщение Anonymous
  • Как использовать систему с несколькими очередями, которая работает параллельно, используя балансировщик нагрузки в Rabbi
    Anonymous » » в форуме Php
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Шаблон проектирования для реализации шаблона с несколькими очередями
    Гость » » в форуме JAVA
    0 Ответы
    58 Просмотры
    Последнее сообщение Гость

Вернуться в «C++»