C++ 有时间在C+中等待+;程序

C++ 有时间在C+中等待+;程序,c++,visual-c++,visual-studio-2012,fltk,C++,Visual C++,Visual Studio 2012,Fltk,我读这本书。对于我在编译器MS visual studio 2012上安装的图形。我使用的机器是MS Windows 7。 我读那本书直到第17章,我还没有研究过等待的方法。等待意味着执行一条语句,让系统等待一段时间,然后执行第二条语句 下面是一个在窗口上绘制两个形状的简单示例。本书使用的图形库为 例如,在这个代码中,我有两个圆,具有两个不同的位置和不同的半径。 我想先连接圆圈(c1),然后等待一秒钟,分离c1,这次连接c2。等待一秒钟(或更多)的最简单方法是什么 #包括 #包括 使用名称空间图

我读这本书。对于我在编译器MS visual studio 2012上安装的图形。我使用的机器是MS Windows 7。
我读那本书直到第17章,我还没有研究过等待的方法。等待意味着执行一条语句,让系统等待一段时间,然后执行第二条语句

下面是一个在窗口上绘制两个形状的简单示例。本书使用的图形库为

例如,在这个代码中,我有两个
,具有两个不同的位置和不同的半径。
我想先连接
圆圈
c1
),然后等待一秒钟,分离
c1
,这次连接
c2
。等待一秒钟(或更多)的最简单方法是什么

#包括
#包括
使用名称空间图库;
//---------------------------------
类测试:公共窗口{
公众:
测试(点p、点w、点h、常数字符串和标题):
窗口(p、w、h、标题),
退出按钮(点(x_max()-90,20),60,20,“退出”,cb_退出),
c1(点(100100),50),
c2(点(300200),100){
附加(退出按钮);
附(c1);
附加(c2);
}
私人:
圆圈c1、c2;
按钮退出按钮;
void quit(){hide();}
静态void cb_quit(地址,地址pw){reference_to(pw).quit();}
};
//------------------
int main(){
测试ts(点(300250)、800600,“测试”);
返回gui_main();
}

您想使用睡眠功能,它需要毫秒:

Sleep(1000);
如果您使用的是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);
});
#包括
//在测试的构造函数中
标准::异步([&]()
{
附加(退出按钮);
附(c1);
std::this_thread::sleep_for(std::chrono::seconds(1));
附加(c2);
});

但这可能不起作用,因为我对您正在使用的库不太了解。

正如您所发现的,
Sleep
不是答案,因为您需要在等待时让控制权传回系统,否则窗口将无法更新

你需要的是一个超时。FLTK提供了
添加超时时间

您需要使用来延迟绘图。FLTK中的方法允许您设置一个计时器,该计时器将在延迟后调用一次。在回调中,您可以附加
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
通过在
attach(c1)
attach(c2)之间休眠,
不会将控制权传递回GUI线程以允许它绘制任何内容。通过使用
add\u 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
//超时后将调用的函数。testWindow对象将是Test类型*
void回调(void*testWindow)
{
测试*t=重新解释(测试窗口);
t->doCallback();
}
类测试:公共窗口
{
公众:
测试(点p、点w、点h、常数字符串和标题):
窗口(p、w、h、标题),
退出按钮(点(x_max()-90,20),60,20,“退出”,cb_退出),
c1(点(100100),50),
c2(点(300200),100)
{
附加(退出按钮);
附(c1);
//设置超时并将指向测试窗口的指针传递给回调
Fl::add_timeout(1.0,回调,this);
}
//方法,该方法由callback()调用并将附加c2
void doCallback()
{
附加(c2);
}
//其他同学

谢谢你的回答。但是Sleep(1000)不允许系统显示
c1
圆圈。我想先看到第一个圆圈,然后在一秒钟后再看到另一个。@s.r.a所以先显示
c1
圆圈,然后
Sleep(1000)
,然后显示下一个圆圈。Sleep()将窗口设置为逗号,不允许查看
c1
或任何先前的形状。我在
attach(c1)
attach(c2)之间添加了该代码
还包括标题。但我有4个错误。其中一个错误是错误8错误C3083:“this_thread”:a':'左侧的符号必须是类型c:\users\cs\documents\visual studio 2012\projects\test_4\test_4\test_4.cpp 18。谢谢。我添加了它,代码可能正在运行。但这不是我想要的。此方法的作用就像睡眠(1000)。请阅读下面答案的评论。谢谢你的回答。但是它们对我来说都是新的。而且我是新手。你能做一个简单的代码让系统等待一秒钟吗?@s.r.a我添加了一个代码示例,但我没有FLTK,所以它可能无法立即工作。我已经安装了FLTK,它对我来说很好。非常感谢。我测试了编码并知道结果。我将
FI::
(大写I)更改为
Fl::
(小l)。并且还放置
无效回调(void*testWindow)
body在类的下面,但又出现了4个错误。其中一个错误是:_error8 Error C3867:“Fl_Widget::callback”:函数调用缺少参数列表;使用“&Fl_Widget::callback”创建指向成员c:\users\cs\documents\visual studio 2012\projects\test_4\test_4\test_4.cpp 22”回调需要在使用位置的上方声明d(但如果需要,可以在下面定义)。我已经修复了示例中的案例错误。感谢您的回复。