我读过this本书。对于我在我的编译器,MS visual studio 2012上安装FLTK的图形。我使用的机器是MS Windows 7. 直到第17章我才看过那本书,我还没有研究过任何等待的方法。通过等待我的意思是执行一个语句,使系统等待一段时间,并执行第二个语句。
在下面有一个简单的例子,它在窗口上绘制两个形状。用于本书的图形库是here。
例如,在此代码中,我有两个circles
,其中包含两个不同的位置和不同的半径
我想首先附加circle
(c1
),而不是等待一秒,然后分离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();
}
答案 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
: