没有合适的构造函数可以从void转换为std:thread

时间:2015-04-14 07:57:22

标签: c++ multithreading

我第一次搞乱线程,我想把它变成一个线程,但似乎做错了。

void FloodFill(CDIB32* scr, int x, int y)

{

 scr ->GetRGB(x,y, (byte) r,(byte) g,(byte)b);
 if (r == 255 && g == 0 && b == 0)
     return;

 if (!(r == 255 && g == 255 && b == 255))
    return;

 scr ->SetRGB(x, y,(byte)255,(byte) 0,(byte) 0);

    FloodFill(&m_screenDib, x+1, y);
    FloodFill(&m_screenDib, x-1, y);
    FloodFill(&m_screenDib, x, y+1);
    FloodFill(&m_screenDib, x, y-1);
    FloodFill(&m_screenDib, x+1, y+1);
    FloodFill(&m_screenDib, x+1, y-1);
    FloodFill(&m_screenDib, x-1, y+1);
    FloodFill(&m_screenDib, x-1, y-1);
    return;

}


void DoIt()

{

if (!m_done)
{
    Reset();

    for (int i = 0; i < REZ * REZ; ++i)
    {
        CPoint mid;
        GetBlobMidPoint(i, mid);

        xpos = mid.x;
        ypos = mid.y;

        FloodFill(&m_screenDib, xpos, ypos);
        std::thread floodfill([this, xpos, ypos] { FloodFill(&m_screenDib, xpos, ypos); });

    ::PostMessage(g_hWnd, FLOOD_FINISHED, NULL, NULL);

    m_done = true;
    }
}

}

Floodfill是一个简单的Floodfill算法,我得到了错误

错误1错误C2440:'初始化':无法从'void'转换为'std :: thread'

3 个答案:

答案 0 :(得分:3)

调用函数FloodFill而不是将它传递给线程。这样做:

std::thread floodfill(&FloodFill, &m_screenDib, xpos, ypos);

如果您的标准库没有正确实现标准的这一部分,您可以使用函数对象解决它:

std::thread floodfill([this, xpos, ypos] { FloodFill(&m_screenDib, xpos, ypos); });

以上假设问题中的代码实际上位于具有成员m_screenDib的类的非静态成员函数内。如果情况并非如此,则必须相应地调整lambda。

现在澄清所涉及的所有变量都是全局的,没有必要捕获它们。就这样做:

std::thread floodfill([] { FloodFill(&m_screenDib, xpos, ypos); });

答案 1 :(得分:1)

您的代码尝试使用调用函数的结果初始化一个线程,这没有任何意义。

据推测,您希望线程调用该函数。您需要传递函数指针(或函数对象)作为第一个构造函数参数,然后传递给它的任何参数:

std::thread floodfill(FloodFill, &m_screenDib, xpos, ypos);
std::thread floodfill([=]{FloodFill(&m_screenDib, xpos, ypos);});

答案 2 :(得分:0)

问题是(FloodFill(&m_screenDib, xpos, ypos)是一个实际的函数调用。您正尝试使用函数调用的结果初始化线程。

相反,将函数及其参数分别传递给线程: std::thread floodfill { &FloodFill, &m_screenDib, xpos, ypos };

请注意,许多GUI技术不支持线程。