【c++】沒有合適的建構函式可將void從void轉換為std:thread
阿新 • • 發佈:2021-01-27
我是第一次弄亂執行緒,我想把它變成執行緒,但似乎做錯了什麼。
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:“正在初始化”:無法從“無效”轉換為“ std :: thread”
解決辦法
您正在呼叫函式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); });
