1. 程式人生 > c++ > 沒有合適的建構函式可將void從void轉換為std:thread

【c++】沒有合適的建構函式可將void從void轉換為std:thread

我是第一次弄亂執行緒,我想把它變成執行緒,但似乎做錯了什麼。

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); });