小编Nav*_*een的帖子

在Win32/MFC中停止一个线程

我正在阅读一些与线程相关的代码,并发现了这段代码:

MyThread::start()
{
  //Create a thread
  m_pThread = AfxBeginThread(/*some parameters*/)

  //Create a duplicate handle for the created thread
  m_hDuplicateHandle = DuplicateHandle(/* some more parameters*/)
}

MyThread::stop()
{
  //Set some variables so that the thread comes out of its run() function
  WaitForSingleObject(m_hDuplicateHandle, defaultTimeout);

  CloseHandle(m_hDuplicateHandle);
}
Run Code Online (Sandbox Code Playgroud)

我的问题,为什么需要重复的句柄?我们不能直接等待原来的线程句柄吗?它以某种方式变得无效吗?

c++ winapi mfc multithreading

3
推荐指数
1
解决办法
2876
查看次数

使用模板函数生成的代码与普通函数之间的差异

我有一个包含大量元素的向量.现在我想编写一个小函数来计算向量中偶数或奇数元素的数量.由于性能是一个主要问题,我不想在循环中放入if语句.所以我写了两个小函数,如:

long long countOdd(const std::vector<int>& v)
{
    long long count = 0;
    const int size = v.size();
    for(int i = 0; i < size; ++i)
    {
        if(v[i] & 1)
        {
            ++count;
        }
    }
    return count;
}

long long countEven(const std::vector<int>& v)
{
    long long count = 0;
    const int size = v.size();
    for(int i = 0; i < size; ++i)
    {
         if(0 == (v[i] & 1))
        {
            ++count;
        }
    }
    return count;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是我可以通过编写这样的单个模板函数来获得相同的结果:

template <bool countEven>
long long countTemplate(const …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-construction templates code-generation

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

将std :: bind2nd与引用一起使用

我有一个像这样的简单类:

class A
{
public:
    void f(const int& n)
    {
        std::cout<<"A::f()" << n <<"\n";
    }
};
Run Code Online (Sandbox Code Playgroud)

我试图像这样使用它:

std::vector<A> vec;
A a;
vec.push_back(a);
std::for_each(vec.begin(), vec.end(), std::bind2nd(std::mem_fun_ref(&A::f), 9));
Run Code Online (Sandbox Code Playgroud)

但是当我编译代码时,我在函数头文件中的某处得到以下错误:

错误C2529:'_ Right':对引用的引用是非法的

如果我删除参数f()中的引用,它编译正常.我该如何解决这个问题?我不想删除引用,因为在我的实际代码中复制对象是非常昂贵的.另外,我没有使用提升.

c++ stl

3
推荐指数
1
解决办法
2018
查看次数

如何将std :: wstring与std :: istringstream一起使用?

我正在尝试编写一个模板函数,它将从给定的字符串中提取给定数据类型的值.我提出了这样的事情:

   template<class T>
    static T getValue(const CString& val_in)
    {
        std::wstring value = val_in;
        std::istringstream iss;
        iss.str(value);

        T val = T();
        iss>>val;
        return val;
    }
Run Code Online (Sandbox Code Playgroud)

但是这会给iss.str(value)语句带来以下错误.

错误C2664:'void std :: basic_istringstream <_Elem,_Traits,_Alloc> :: str(const std :: basic_string <_Elem,_Traits,_Ax>&)':无法将参数1从'std :: wstring'转换为'const std :: basic_string <_Elem,_Traits,_Ax>&'

所以基本上std::istringstream只接受std::string.我以为可能有一个,std::wistringstream但似乎没有一个可用.任何线索我该怎么办?

c++ stl stream

3
推荐指数
1
解决办法
7484
查看次数

GetGuiResources WIn32 API用法

我试图用来GetGuiResources找到我的程序使用的Gui资源.它将一个标志作为第二个参数.我想知道的区别GR_USEROBJECTSGR_GDIOBJECTS.我找不到任何关于它的文档.谁能解释一下它们之间有什么区别?我也知道默认情况下,一次最多可以打开10k GDI句柄.返回的值是否GR_GDIOBJECTS计入此10k限制的一部分?

c++ winapi mfc win32gui

3
推荐指数
1
解决办法
604
查看次数

编码样式 - 输入验证

哪个是验证传递给函数的输入的最佳方法,即在继续执行某些操作之前验证所有输入

class A;
void fun(A* p)
{
  if(! p)
  {
    return;
  }

 B* pB = p->getB();
  if(! pB)
  {
    return;
  }

.......

}
Run Code Online (Sandbox Code Playgroud)

或者你这样写:

void fun(A* p)
{
  if(p)
  {
    B* pB = p->getB();
    if(pB)
    {
      .....
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我问这个是因为,如果我使用第一种风格,那么我的代码中会有多个返回语句,很多人说这些语句很糟糕(不知道为什么),如果我使用第二种风格则会有太多级别嵌套在我的代码中.

c++ coding-style

2
推荐指数
1
解决办法
761
查看次数

Visual Studio中的免费IntelliSense for C++

有没有人知道任何可用于C++的免费IntelliSense工具,它至少是Visual Assist X功能的50%(当然不是免费的)?基本上我希望我的intellisense工作而不加载我的完整工作区/解决方案?我见过Visual Assist,它提供了这个功能.

c++ ide intellisense visual-studio

2
推荐指数
1
解决办法
6842
查看次数

Fopen无法使用二进制文件

我有一个巨大的二进制文件,是2148181087字节(> 2GB)

我正在努力,但fopen (file, "r")它失败了

无法打开:xyz文件(值太大,无法存储在数据类型中)

当文件大小> 2gb时,我在手册页上看到EOVERFLOW错误.

奇怪的是,我使用了一个不同的输入文件,它"几乎"与第一个文件2142884400字节(也是> 2gb)一样大,fopen可以正常工作.

文件大小是否有任何截止,fopen或者有没有其他方法可以解决这个问题?

c fopen memory-management

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

使用boost lambdas

我是新手,并试图编写一些简单的程序来理解它.在下面的代码中,我试图用随机数填充数组.这是我的代码:

    using namespace boost::lambda;
    srand(time(NULL));
    boost::array<int,100> a;
    std::for_each(a.begin(), a.end(), _1=rand());
Run Code Online (Sandbox Code Playgroud)

但它看起来rand()只被评估一次,我的数组包含每个元素的相同值.任何人都可以指出这段代码有什么问题吗?

c++ boost boost-lambda

2
推荐指数
1
解决办法
491
查看次数

隐式类型转换 - 编译器错误

这个问题与这个问题有关.以下代码编译精细的VC9编译器,但在与Comeau在线编译时给出错误.任何人都可以告诉我哪一个是正确的,错误是什么意思?

错误:暧昧"?" 操作:类型"TypesafeBool"的第二个操作数可以转换为第三个操作数类型"bool",反之亦然TypesafeBool b =(1 == 1)?f():false;

class TypesafeBool
{
private:
    bool m_bValue;
    struct Bool_ { 
        int m_nValue; 
    };
    typedef int Bool_::* bool_;
    inline bool_ True() const { return &Bool_::m_nValue; }
    inline bool_ False() const { return 0; }

public:
    TypesafeBool( const bool bValue ) : m_bValue( bValue ){}
    operator bool_() const { return m_bValue ? True() : False(); }
};

TypesafeBool f()
{
    return TypesafeBool(true);
}

int main()
{
    TypesafeBool b = (1==1) ? f() : false; …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors type-conversion

2
推荐指数
1
解决办法
1764
查看次数