如何在自己的线程上运行时钟
How to run a clock on its own thread
我试图在c++中创建一个步骤测序器,最终将发送MIDI数据。我通过在它自己的线程上有一个时钟来创建它,该线程计算自上一个节拍以来的时间量,如果是下一个节拍的时间,它就向控制台写入一段数据。
然而,我发现无论我将BPM设置为什么,我获得消息的速度都明显太慢。我似乎不明白为什么这个线程上的时间是错误的,而且我对std::chrono
库的工作方式并不熟悉,这也没有帮助。想法吗?
#include <thread>
#include <mutex>
#include <chrono>
#include <vector>
#include <iostream>
class StepSequencer {
public:
StepSequencer();
~StepSequencer();
void run();
void setBeatsPerMinute(float bpm);
void addNote(int noteValue, int beatIndex);
void playNote(int beatIndex);
protected:
int mNumberOfBeatBins;
int mSequencerPlayhead;
float mBeatsPerMinute;
float mSecondsPerBeat;
std::vector<int> mBeatBins;
std::mutex mMutex;
std::thread mSequencerThread;
bool mRunSequencerThread;
std::chrono::time_point<std::chrono::system_clock> mLastBeatTime;
std::chrono::time_point<std::chrono::system_clock> mCurrentTime;
};
#include "stdafx.h"
#include "StepSequencer.h"
StepSequencer::StepSequencer() {
mNumberOfBeatBins = 16;
for(int i = 0; i < 16; i++) {
mBeatBins.push_back(0);
}
mBeatsPerMinute = 0;
mSecondsPerBeat = 1;
mLastBeatTime = std::chrono::system_clock::now();
mCurrentTime = std::chrono::system_clock::now();
mSequencerPlayhead = 0;
mRunSequencerThread = false;
mSequencerThread = std::thread(&StepSequencer::run, this);
}
StepSequencer::~StepSequencer() {
if(mSequencerThread.joinable()) {
mSequencerThread.join();
}
}
void StepSequencer::run() {
mRunSequencerThread = true;
while(mRunSequencerThread) {
mCurrentTime = std::chrono::system_clock::now();
mMutex.lock();
if (std::chrono::duration_cast<std::chrono::seconds>(mCurrentTime - mLastBeatTime).count() > mSecondsPerBeat) {
mSequencerPlayhead++;
mSequencerPlayhead = mSequencerPlayhead % mNumberOfBeatBins;
playNote(mSequencerPlayhead);
mLastBeatTime = std::chrono::system_clock::now();
}
mMutex.unlock();
this_thread::sleep_for(std::chrono::milliseconds(1));
}
}
void StepSequencer::setBeatsPerMinute(float bpm) {
mMutex.lock();
mBeatsPerMinute = bpm;
if(mBeatsPerMinute > 0) {
mSecondsPerBeat = 60.0 / mBeatsPerMinute;
}
else {
mSecondsPerBeat = 1;
}
mMutex.unlock();
}
void StepSequencer::addNote(int noteValue, int beatIndex) {
mBeatBins[beatIndex] = noteValue;
}
void StepSequencer::playNote(int beatIndex) {
std::cout << mBeatBins[beatIndex] << std::endl;
}
std::chrono::seconds
表示为'至少35位的有符号整型'。所以你将得到一个count()
的值,它每秒只增加一次,给出每分钟60、30、20、15、12等次的选择。
以毫秒为单位工作,或者使用由浮点值支持的自定义持续时间
相关文章:
- 运行程序时出现问题
- 分段错误当我试图运行程序时出错
- 在cygwin中运行c++脚本时发生错误
- C++ 每次运行程序时我都会"nan"输出的问题
- 运行代码时,c++ 会终止进程
- 通过 g++ 运行程序时没有这样的文件或目录
- 分段故障 运行C++代码时出现 SIGSEGV
- 运行Qt时处理退出代码0xC0000135 hello world
- 为什么当我在 c++ 中运行函数时,我的代码显示数字 53
- 尝试运行 gmp 时未找到 MPIR.dll
- C++ .我正在尝试通过使用开关内的数组来获取用户输入,但是当我运行代码时,它显示分段错误?
- 如何在每次运行程序时写入文件的下一行?
- win10 尝试在我运行它时寻找问题的解决方案
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- pybind11:属性错误:尝试从 py 文件运行函数时,模块'XXX'没有属性'YYY'
- 当我使用 system() 在 PHP 中运行命令时没有LD_LIBRARY_PATH
- C++随机数生成器通常在 Visual Studio 中运行程序时在 2 次后停止生成数字
- 任务计划程序:设置运行级别时拒绝访问
- 在Visual Studio 2017中使用Qt库的CMake项目:运行exe时找不到Qt dll
- 运行代码时C++错误