C ++刷新线程

时间:2015-11-21 00:37:27

标签: c++ multithreading

我有这个项目,我正在研究哪里有一个显示机器人坐标的标签。但是要做(并且由于特定情况)我需要像每1秒运行一次函数来给我这些值。 每一秒都会是这样的:

label1->Text = read_position(axis1);

但我不知道该怎么做..可以请别人帮忙吗?谢谢 ! 编辑:使用Visual Studio 2015

3 个答案:

答案 0 :(得分:1)

如果您正在使用某种GUI框架,我建议您不要将多线程用于这么简单的事情。例如,在win32中,您可以使用SetTimer函数。

答案 1 :(得分:0)

您添加了多线程'标记,所以我想你可以自由使用多个线程。因此,执行此操作的方法是启动一个新线程,该线程将执行以下操作:

while( ! instructed_to_quit() )
{
    give_him_those_values();
    sleep_for_a_second();
}

准确地说明如何实现这些步骤的具体细节在很大程度上取决于您所运行的系统类型,您对此非常保守,所以如果您告诉我们更多相关内容,我们可能会提供帮助更多。

答案 2 :(得分:0)

由于您使用的是Visual Studio 2015,因此可以使用C ++ 11的标准线程和原子变量。有一些不同的可能解决方案,以下是其中之一。

static MyRobotForm myRobot(void);
static std::thread reader;
static std::atomic<double*> coordinates(nullptr);
static std::atomic<bool> shutdown(false);

static void position_reader() {
   // loop until app is alive
   while(!shutdown) {
       // fetch the coordinates array
       double *temp = read_all_axis(myRobot.Cp, decision);
       // atomically replace the old unused value or nullptr
       temp = coordinates.exchange(temp);
       // it is safe to delete nullptr
       delete temp;
       // sleep for the proper time
       std::this_thread::sleep_for(1s);
   }
   // finicky but correct
   delete coordinates.load();
}

int main(int argc, char **argv) {
    // start the reading thread
    reader = std::thread(position_reader);
    // where depends on gui toolkit ???
    // atomically seize the current value
    double *temp = coordinates.exchange(nullptr);
    if(temp != nullptr) {
        label1->Text = std::string(/*decide how to display temp*/);
        delete temp;
    }
    // on application exit
    shutdown = true;
    reader.join();
    return 0;
}

我没有测试过,但应该可以使用。你使用什么GUI工具包? *)