2012-10-12 54 views
0
auto task = create_task(Windows::Storage::KnownFolders::PicturesLibrary->GetFilesAsync(Windows::Storage::Search::CommonFileQuery::OrderBySearchRank)); 

task.then([&sstrpath](Windows::Foundation::Collections::IVectorView<Windows::Storage::StorageFile^>^ files) 
{ 
    CCLog("num of files detected %d",files->Size); 
    Platform::String^ pathstr = files->GetAt(0)->Path; 
    OutputDebugStringW(pathstr->Data()); 

    auto task2 = create_task(files->GetAt(0)->OpenAsync(Windows::Storage::FileAccessMode::Read)); 

    task2.then([](Windows::Storage::Streams::IRandomAccessStream^ filestream) 
    { 
     Windows::UI::Xaml::Media::Imaging::BitmapImage^ bmp = ref new Windows::UI::Xaml::Media::Imaging::BitmapImage(); 
     bmp->SetSource(filestream); 
    } 
    ); 
} 
); 

將其在Win8的RTM完成與VS表達RTM在C++(cocos2dx框架)。我正試圖從圖片庫中加載一個圖像,並從中創建一個BitmapImage。接下來是在cococs2dx中以某種方式使用BitmapImage for CCSprite,但這不是問題。該程序能夠一直運行到task2中,但在嘗試重新引入BitmmapImage時會崩潰。以下是在輸出控制檯加載圖像分成的BitmapImage

First-chance exception at 0x75004B32 in myGame.exe: Microsoft C++ exception:   
Platform::WrongThreadException^at memory location 0x02D1D794. HRESULT:0x8001010E 
First-chance exception at 0x75004B32 in myGame.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000. 
First-chance exception at 0x75004B32 in myGame.exe: Microsoft C++ exception: 
Platform::WrongThreadException^at memory location 0x02D1E5F0. HRESULT:0x8001010E 
Unhandled exception at 0x622C9AD1 (msvcr110d.dll) in PixBlitz.exe: An invalid parameter was passed to a function that considers invalid parameters fatal. 

我真的不知道在那裏根據適用於Win8應用程序開發的JavaScript或XAML是我做錯了,因爲大多數教程。

+0

您的應用程序是否有權限訪問該文件位置和文件類型? – mydogisbox

+0

是的,如果不是,執行不會通過第一個任務。 –

回答

0

創建像這樣的任務將代碼移動到不同的線程。當您從錯誤的線程訪問對象時,您會收到Platform :: WrongThreadException。每次都必須從同一個線程訪問GUI組件。

我相信如果將RunAsync運行到Dispatcher上,那將會使線程正確。將委託傳遞給RunAsync,並讓該委託包含創建BitmapImage以及任何其他您想要對BitmapImage執行的操作。


按照要求,舉例說明。

雖然我熟悉WPF,但我並不熟悉Win8開發。 (如果C++/CLI現在支持lambda表達式,那麼我將不得不回過頭來修改關於這個主題的一些舊的答案。)

我相信這是你想要的。我可能在該委託上稍微有一些語法。

Stream^ filesteam = files->GetAt(0)->Open(FileAccessMode::Read); // we're already on a background thread, no need for a Task if we're not going to call 'then'. 

// I'm assuming 'this' is a subclass of Windows.UI.Xaml.Window, or something similar. 
this->Dispatcher->RunAsync(CoreDispatcherPriority::Low, []() 
{ 
    BitmapImage^ bmp = ref new BitmapImage(); 
    bmp->SetSource(filestream); 
} 
); 
+0

感謝大衛的回答,但你有點迷失了我。我非常習慣於只使用cocos2d(-x),並且對Win8開發庫非常不熟悉。你可以用一個例子來解釋它嗎? –

+0

我不熟悉Win8開發,但我熟悉它基於的WPF。試試這個代碼。 –