C++ c++;使用频繁间隔调用多个方法

C++ c++;使用频繁间隔调用多个方法,c++,c++17,C++,C++17,我的应用程序与监视功能相关。要求同时监控很多特性。 我为每个特性定义了单独的方法 例如: 我在另一个使用多if-else条件的方法中调用这些方法 例如: 我的要求是以特定的时间间隔将所有或用户指定的功能(可以是多个)值记录在csv文件中。最小间隔为2毫秒。假设用户希望以2毫秒的间隔记录50个功能,则我的日志文件应在一分钟内生成500*50个条目 std::ofstream logFile("log.csv"); std::vector<std::string> f

我的应用程序与监视功能相关。要求同时监控很多特性。 我为每个特性定义了单独的方法

例如:

我在另一个使用多if-else条件的方法中调用这些方法 例如:

我的要求是以特定的时间间隔将所有或用户指定的功能(可以是多个)值记录在csv文件中。最小间隔为2毫秒。假设用户希望以2毫秒的间隔记录50个功能,则我的日志文件应在一分钟内生成500*50个条目

std::ofstream logFile("log.csv");
std::vector<std::string> featureList{"f1", "f2", "f3", "f4" …….. "f50"};

while(stopRequested)
{
    for(auto iter : featureList)
    {
        std::string output{};
        getValue(iter, output);
        logFile <<  output << ",";
    }
    logFile << "\n";
    std::this_thread::sleep_for(2ms);
}
std::of流日志文件(“log.csv”);
标准::向量特征列表{“f1”、“f2”、“f3”、“f4”…..“f50”};
while(请求停止)
{
用于(自动iter:功能列表)
{
std::字符串输出{};
getValue(iter,输出);

日志文件为了计算循环体所花费的时间,您可以在所有计算之前计算新循环迭代的时间,然后使用
sleep\u直到

while(!stopRequested)
{
使用名称空间std::chrono_文本;
自动下一个时钟时间点=std::chrono::stable\u clock::now()+2ms;
用于(自动iter:功能列表)
{
std::字符串输出{};
getValue(iter,输出);

日志文件侧注:当我懒惰且不需要性能时,用一大组你称之为特性的东西编写东西,或者期望有一大组时,我将使用
std::unordered_映射
,并且不再需要
if
s和
else if
s。侧注:现代编译器将执行
std::string getValue(std::string featureName)
的工作量与void getValue(std::string featureName、std::string&output)的工作量相同
多亏了复制省略,您可以编写更简单的代码:
日志文件使用一个线程顺序调用
getValue
,一个线程处理对日志文件的写入。您可以使用无锁版本,以尽可能少地影响
getValue
的性能。更正上面的代码2注释:
logFile还请注意,在典型的台式PC上,您可能无法获得可靠的2ms滴答声。
chrono
可能解析为纳秒,但它只能提供底层系统设计的信息。
void getValue(std::string featureName, std::string &output)
{
    if(featureName.compare("f1") == 0)
    {
        feature1(output);
    }
    else if(featureName.compare("f2") == 0)
    {
        feature2(output);
    }
    .
    .
    .
    .
    else if(featureName.compare("f100") == 0)
    {
        feature100(output);
    }
    
}
std::ofstream logFile("log.csv");
std::vector<std::string> featureList{"f1", "f2", "f3", "f4" …….. "f50"};

while(stopRequested)
{
    for(auto iter : featureList)
    {
        std::string output{};
        getValue(iter, output);
        logFile <<  output << ",";
    }
    logFile << "\n";
    std::this_thread::sleep_for(2ms);
}