我第一次搞乱线程,我想把它变成一个线程,但似乎做错了。
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'
答案 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技术不支持线程。