Цель 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
У меня есть тупик? Стоит ли вместо этого использовать кольцевой буфер с очередями? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Ошибка «Кольцевой буфер RX заполнен» в PySerial, несмотря на очистку буферов
Anonymous » » в форуме Python - 0 Ответы
- 27 Просмотры
-
Последнее сообщение Anonymous
-