如何在 C++ 和 FLTK 中实现倒计时时钟?
Posted
技术标签:
【中文标题】如何在 C++ 和 FLTK 中实现倒计时时钟?【英文标题】:How to implement a countdown clock in C++ and FLTK? 【发布时间】:2015-08-16 01:58:09 【问题描述】:我使用 Programming with C++ 中的 FLTK 和 Gui 库创建了一个小游戏,我想使用倒计时时钟计时器。 FLTK 有 Fl::add_timeout(double t,Callback) 非常有用。问题是我想在我的类中使用该函数,以便在调用它时可以更改窗口内的任何内容。该功能必须是静态的,因此我无法访问窗口并进行我想要的更改。 Gui 库只包含对业余程序员有用的东西,所以我不能使用函数 reference_to()。有什么想法我可以使用该功能或任何其他方式来实现它吗?感谢您的宝贵时间。
我的代码:
#include"GUI.h"
#include<FL/Fl.h>
#include"Simple_window.h"
class Game : public Window
Button *b;
//variables i need for the window
public:
Game(Point xy,int w,int h, const string& name) : Window(xy,w,h,name)
b=new Button(Point(100,100),40,20,"Button"cb_button);
Fl::add_timeout(1.0,TIME);
~Game()
delete b;
static void cb_button(Address,Address addr)
reference_to<Game>(addr).B();
void B()
static void TIME(void *d)
//access to the variables like this->...
Fl::repeat_timeout(1.0,TIME);
;
int main()
Game win(Point(300,200),400,430,"Game");
return Fl::run();
【问题讨论】:
您可能应该编辑您的问题以使您的要点更易于理解。根据我收集到的信息,1. 您想使用 FLTK 库中的一个函数,该函数采用回调函数。 2.这个函数需要是一个静态c风格的函数才能作为回调传递。 3. 您不确定如何访问您的 Game 类的实例,因为该函数是静态的。简单的解决方法是将“this”作为第三个参数传递给 add_timeout,如下所示: add_timeout(1.0, TIME, this);然后,在 TIME(void *d) 中,你可以说 static_cast这里的要点是:
你想使用一个函数(add_timeout)
它需要一个 c 风格的回调,所以你给它一个静态成员函数。
您不确定如何从静态方法访问实例变量。
从此处的文档:http://www.fltk.org/doc-2.0/html/index.html,您可以看到 add_timeout 函数将 void* 作为其第三个参数,该参数传递给您的回调。这里的快速解决方法是将 this 指针传递给 add_timeout 函数,然后将其转换为 Game* 以访问您的成员变量,如下所示:
#include"GUI.h"
#include<FL/Fl.h>
#include"Simple_window.h"
class Game : public Window
public:
Game(Point xy,int w,int h, const string& name)
: Window(xy,w,h,name), b(nullptr)
b = new Button(Point(100,100),40,20,"Button", cb_button);
Fl::add_timeout(1.0, callback, (void*)this);
~Game()
delete b;
static void cb_button(Address, Address addr)
reference_to<Game>(addr).B();
void B()
static void callback(void *d)
Game* instance = static_cast<Game*>(d);
instance->b; // access variables like this->
Fl::repeat_timeout(1.0,TIME);
private:
//variables you need for the window
Button *b;
;
int main()
Game win(Point(300,200),400,430,"Game");
return Fl::run();
【讨论】:
别忘了选择它作为答案!!哈哈。 你可以使用同样的技巧来启动成员函数pthread_create
/_beginthreadex
;)以上是关于如何在 C++ 和 FLTK 中实现倒计时时钟?的主要内容,如果未能解决你的问题,请参考以下文章