我想使用一个管理线程(或几个线程)的类.使用组合,这看起来像:
class MyClass{
private:
std::thread mythread;
void _ThreadMain();
public:
MyClass();
// other fields
}
Run Code Online (Sandbox Code Playgroud)
因为a的默认构造函数std::thread
是没有意义的,我需要在MyClass
构造函数中显式调用它:
MyClass::MyClass() : mythread(&MyClass::_ThreadMain,this) {}
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,该_ThreadMain
方法很可能在 MyClass
构造之前执行,从而导致任何类型的奇怪行为.这显然是不安全的.我怎样才能解决这个问题?
一个明显的解决方案是使用指针std::thread
代替,并添加另一个成员函数:
void MyClass::Start(){
// This time mythread is of type std::thread*
mythread = new std::thread(&MyClass::_ThreadMain,this); // One could use std::unique_pointer instead.
}
Run Code Online (Sandbox Code Playgroud)
这将启动该线程.在这种情况下,它将在构造类之后调用,这确实是安全的.
但是,我想知道是否有任何合理的解决方案可以让我不使用指针.感觉它应该是可能的某种方式(嘿,必须有一种方法来在构建一个类时启动一个线程!),但我无法想出任何不会引起麻烦的事情.
我考虑过使用一个条件变量,_ThreadMain
等待构造函数完成它的工作,但是在构造类之前我不能使用它,对吧?(如果MyClass
是派生类,这也没有用)
我正在使用gtkmm编写应用程序.
我写了一个简单的widget类,我只想在某些情况下在应用程序的主窗口中显示它.否则,我希望标签"禁用"可见.
为了实现这一点,我将小部件和标签打包到一个VBox中,然后我展示()并隐藏()它们以交换它们.
但是,自定义小部件远远大于标签,因此我需要稍微调整标签大小.
我知道我可以使用label.set_size_request(x,y),当我手动输入尺寸时,它可以工作.但我知道,小部件的大小可能有所不同,具体取决于使用的Gtk主题等.
我喜欢将标签设置 为与小部件完全相同的尺寸*.但是,使用widget.get_height()*不起作用 - 它总是返回1.
也许一个线索是我在主窗口的构造函数中执行此操作.
我有一个使用扭曲框架的python应用程序。
我利用了扭曲产生的pidfile中存储的值。启动脚本会检查它是否存在,如果pidfile已经存在,则不会生成守护进程。
但是,twist不会在收到SIGKILL
信号时删除.pid文件。这使启动器脚本认为守护程序已在运行。
我意识到停止守护程序的正确方法是使用SIGTERM
信号,但是问题是启动守护程序的用户注销后,守护程序永远不会收到SIGTERM
信号,因此显然被杀死了SIGKILL
。这意味着一旦用户注销,他将永远无法再次启动守护程序,因为pidfile仍然存在。
在这种情况下,有什么办法可以使该文件消失?
我写了一个使用Cairo在屏幕上绘制内容的应用程序(准确地说是在Gtk :: DrawingArea上).它需要经常重绘所有内容.事实证明,尽管绘制的字形非常简单,但X服务器在重绘时使用了大量的CPU,而且应用程序运行速度非常慢.有什么方法可以加快速度吗?或者也许我不应该使用DrawingArea和其他一些小部件?
我绘制的是一组矩形,用户可以通过鼠标拖动来移动它们.整个绘图是使用on_expose_event完成的,但是当鼠标指针移动时(按下按钮),我调用queue_draw()来刷新绘图.
我发现了一个有趣的案例,相同的C++代码在不同的系统上产生不同的结果.
#include <cstdio>
int main()
{
int a=20, b=14;
if(a*1.0/b*(a+1)/(b+1)==2) printf("YES!");
else printf("NO!");
}
Run Code Online (Sandbox Code Playgroud)
使用GCC 4.6.3在Ubuntu Linux 12.04上编译,输出YES!
使用GCC 4.6.2在Windows 7上编译,输出NO!
但是,使用:
double c = a*1.0/b*(a+1)/(b+1);
if (c==2) printf("YES!");
...
Run Code Online (Sandbox Code Playgroud)
将返回YES!在两台机器上.
有什么想法出现这种差异?这是由编译器版本不匹配引起的(路径级版本号应该不重要)?为什么它实际输出NO!在Windows机器上,这种情况显然是真的吗?