有时间等待C ++程序

时间:2015-01-22 12:33:12

标签: c++ visual-c++ visual-studio-2012 fltk

我读过this本书。对于我在我的编译器,MS visual studio 2012上安装FLTK的图形。我使用的机器是MS Windows 7. 直到第17章我才看过那本书,我还没有研究过任何等待的方法。通过等待我的意思是执行一个语句,使系统等待一段时间,并执行第二个语句。

在下面有一个简单的例子,它在窗口上绘制两个形状。用于本书的图形库是here

例如,在此代码中,我有两个circles,其中包含两个不同的位置和不同的半径 我想首先附加circlec1),而不是等待一秒,然后分离c1并附加c2。等待一秒钟(或更长时间)的最简单方法是什么?

#include <Windows.h>
#include <GUI.h>
using namespace Graph_lib;

//---------------------------------

class Test : public Window {

public:
    Test(Point p, int w, int h, const string& title):
        Window(p, w, h, title),
        quit_button(Point(x_max()-90,20), 60, 20, "Quit", cb_quit),
        c1(Point(100,100), 50),
        c2(Point(300,200), 100) {
            attach(quit_button);
            attach(c1);
            attach(c2);
    }

private:
    Circle c1, c2;

    Button quit_button;

    void quit() { hide(); }
    static void cb_quit(Address, Address pw) {reference_to<Test>(pw).quit();}
};

//------------------

int main()  {
        Test ts(Point(300,250), 800, 600, "Test"); 
        return gui_main();
}

4 个答案:

答案 0 :(得分:1)

如果你正在使用c ++ 11:

std::this_thread::sleep_for(std::chrono::seconds(1));

否则使用Windows功能睡眠。

如果你想在不阻塞主线程的情况下等待,你可以使用std :: async:

#include <future>

// in your Test's constructor
std::async([&]()
{
    attach(quit_button);
    attach(c1);
    std::this_thread::sleep_for(std::chrono::seconds(1));
    attach(c2);
});

这可能不起作用,因为我对你正在使用的库知之甚少。

答案 1 :(得分:1)

您需要使用callbacks来延迟绘图。 FLTK中的add_timeout方法允许您设置一个在延迟后调用一次的计时器。在回调中,您可以附加c2

attach(c1)attach(c2)之间休眠不会将控制权传递回GUI线程以允许它绘制任何内容。通过使用add_timeout控件传递回GUI线程,以便它可以绘制c1。一秒钟之后,您的回调将被调用,您可以在其中附加c2

// The function that will be called after the timeout.  The testWindow object will be of type Test*
void callback(void* testWindow)
{
    Test* t = reinterpret_cast<Test*>(testWindow);
    t->doCallback();
}

class Test : public Window 
{
public:
    Test(Point p, int w, int h, const string& title):
        Window(p, w, h, title),
        quit_button(Point(x_max()-90,20), 60, 20, "Quit", cb_quit),
        c1(Point(100,100), 50),
        c2(Point(300,200), 100)
    {
        attach(quit_button);
        attach(c1);
        // Setup the timeout and pass a pointer to the Test window to the call back
        Fl::add_timeout(1.0, callback, this);
    }

    // Method that is called by callback() and will attach c2
    void doCallback()
    {
        attach(c2);
    }

    // rest of class

答案 2 :(得分:0)

你想使用Sleep函数,这需要几毫秒:

Sleep(1000);

答案 3 :(得分:0)

正如您所知,Sleep不是答案,因为您需要让控件在等待时传回系统,否则窗口将不会更新。

您需要的是超时。 FLTK提供add_timeout

http://www.fltk.org/doc-1.1/Fl.html#Fl.add_timeout