在我的win32應用程序中,我使用主線程中的稀疏信息(所有項目,但基本上只包含一個標籤)填充列表視圖。之後,我想開始從光盤讀取圖像和文本文件並更新相應的項目。這應該在單獨的線程(std::thread
)中完成,因爲從圖像生成縮略圖並分析整個文本文件需要相當長的時間。 我已經嘗試直接從附加線程更新列表視圖的圖像列表,但是當我嘗試通過ListView_GetImageList()
檢索指向圖像列表的指針時,應用程序崩潰。 所以我想以某種方式將新數據傳遞迴主線程並調用更新是個好主意。在這種情況下有沒有建議的方法可以做到這一點?如何從另一個線程更新列表視圖
更新: 這是我迄今爲止使用ScottMcP-MVP建議的方法的代碼。它調用的SendMessage()
後引起無限循環:
#define WM_UPDATE_THUMBNAIL (WM_APP + 1)
void loadThumbnail(HWND hwndMain, size_t index, std::string file)
{
HBITMAP thumbnail = GenerateThumbnail(file, THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT);
SendMessage(hwndMain, WM_UPDATE_THUMBNAIL, (WPARAM)thumbnail, (LPARAM)index);
}
bool UpdateListView(HWND hwndMain)
{
HWND listview = GetDlgItem(hwndMain, IDC_BROWSE_LIST);
if (!listview) return false;
// clear previous data
ListView_DeleteAllItems(listview);
ImageList_Destroy(ListView_GetImageList(listview, LVSIL_NORMAL));
// create a new image list
HIMAGELIST imageList = ImageList_Create(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, ILC_COLOR24, nItems, 1);
ListView_SetImageList(listview, imageList, LVSIL_NORMAL);
// add all items with label only
for (size_t iItem = 0; iItem < items.size(); ++iItem) {
LVITEM lvItem;
lvItem.iSubItem = 0;
lvItem.state = 0;
lvItem.iItem = (int)iItem;
lvItem.mask = LVIF_TEXT;
lvItem.pszText = items[iItem].label;
lvItem.cchTextMax = 256;
ListView_InsertItem(listview, &lvItem);
std::thread t(loadThumbnail, m_hWnd, iItem, items[iItem].thumbnailFile);
}
return true;
}
INT_PTR CALLBACK DialogProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
// ...
case WM_UPDATE_THUMBNAIL: {
// this block is never reached
break;
}
}
}
[SendMessage](http://msdn.microsoft.com/en-gb/library/windows/desktop/ms644950%28v=vs.85%29.aspx)。從UI線程中只做UI的東西是最安全的。使用'SendMessage'可以讓你做到這一點。此外,它有助於讓[MCVE](http://stackoverflow.com/help/mcve)顯示您嘗試過的內容。 – icabod 2014-10-29 12:49:27
您需要兩種成分來解決此問題:'1'使用[虛擬列表視圖](http://msdn.microsoft.com/en-us/library/windows/desktop/bb774735.aspx#Virtual_ListView_Style)。這可確保您的列表視圖控件立即顯示,而無需等待數據到達。 '2'從你的工作線程發佈一條自定義消息到擁有列表視圖控件的線程,並從那裏使各個客戶區失效。 – IInspectable 2014-10-29 15:29:22