小编raf*_*lak的帖子

有一个安全的方法让std :: thread作为类的成员吗?

我想使用一个管理线程(或几个线程)的类.使用组合,这看起来像:

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是派生类,这也没有用)

c++ multithreading initialization class c++11

14
推荐指数
2
解决办法
8405
查看次数

无法获得小部件的高度/宽度 - gtkmm

我正在使用gtkmm编写应用程序.

我写了一个简单的widget类,我只想在某些情况下在应用程序的主窗口中显示它.否则,我希望标签"禁用"可见.

为了实现这一点,我将小部件和标签打包到一个VBox中,然后我展示()并隐藏()它们以交换它们.

但是,自定义小部件远远大于标签,因此我需要稍微调整标签大小.

我知道我可以使用label.set_size_request(x,y),当我手动输入尺寸时,它可以工作.但我知道,小部件的大小可能有所不同,具体取决于使用的Gtk主题等.

我喜欢将标签设置 为与小部件完全相同的尺寸*.但是,使用widget.get_height()*不起作用 - 它总是返回1.


也许一个线索是我在主窗口的构造函数中执行此操作.

c++ linux gtk widget gtkmm

5
推荐指数
1
解决办法
1164
查看次数

python-twisted和SIGKILL

我有一个使用扭曲框架的python应用程序。

我利用了扭曲产生的pidfile中存储的值。启动脚本会检查它是否存在,如果pidfile已经存在,则不会生成守护进程。

但是,twist不会在收到SIGKILL信号时删除.pid文件。这使启动器脚本认为守护程序已在运行。

我意识到停止守护程序的正确方法是使用SIGTERM信号,但是问题是启动守护程序的用户注销后,守护程序永远不会收到SIGTERM信号,因此显然被杀死了SIGKILL。这意味着一旦用户注销,他将永远无法再次启动守护程序,因为pidfile仍然存在。

在这种情况下,有什么办法可以使该文件消失?

python linux twisted sigkill

5
推荐指数
1
解决办法
496
查看次数

使用Cairo绘图时,有什么方法可以加快/减少CPU使用率?

我写了一个使用Cairo在屏幕上绘制内容的应用程序(准确地说是在Gtk :: DrawingArea上).它需要经常重绘所有内容.事实证明,尽管绘制的字形非常简单,但X服务器在重绘时使用了大量的CPU,而且应用程序运行速度非常慢.有什么方法可以加快速度吗?或者也许我不应该使用DrawingArea和其他一些小部件?

我绘制的是一组矩形,用户可以通过鼠标拖动来移动它们.整个绘图是使用on_expose_event完成的,但是当鼠标指针移动时(按下按钮),我调用queue_draw()来刷新绘图.

c++ gtk gtkmm cairo

4
推荐指数
2
解决办法
2915
查看次数

相同的C++'if'语句,在Linux/Windows上有不同的结果

我发现了一个有趣的案例,相同的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机器上,这种情况显然是真的吗?

c++ gcc mingw multiplatform

3
推荐指数
2
解决办法
784
查看次数