Attualmente sto lavorando su un C++ SDK multipiattaforma al momento e devo trasferire il nostro gestore di assert a WinRT. Una parte del processo consiste nel visualizzare una finestra di messaggio, attendere l'input dell'utente e attivare un punto di interruzione quando l'utente seleziona "debug".Come creare un messagebox modale in WinRT usando C++ nativo
Ho già visualizzato una finestra di messaggio, ma non riesco a trovare il modo di attendere che la finestra di messaggio venga visualizzata senza lasciando il punto corrente di esecuzione.
Ecco il mio codice finora.
// Create the message dialog factory
Microsoft::WRL::ComPtr<ABI::Windows::UI::Popups::IMessageDialogFactory> messageDialogFactory;
Microsoft::WRL::Wrappers::HStringReference messageDialogFactoryId(RuntimeClass_Windows_UI_Popups_MessageDialog);
Windows::Foundation::GetActivationFactory(messageDialogFactoryId.Get(), messageDialogFactory.GetAddressOf());
// Setup the used strings
Microsoft::WRL::Wrappers::HString message;
Microsoft::WRL::Wrappers::HString title;
Microsoft::WRL::Wrappers::HString labelDebug;
Microsoft::WRL::Wrappers::HString labelIgnore;
Microsoft::WRL::Wrappers::HString labelExit;
message.Set(L"Test");
title.Set(L"Assertion triggered");
labelDebug.Set(L"Debug");
labelIgnore.Set(L"Ignore");
labelExit.Set(L"Exit");
// Create the dialog object
Microsoft::WRL::ComPtr<ABI::Windows::UI::Popups::IMessageDialog> messageDialog;
Microsoft::WRL::ComPtr<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::UI::Popups::IUICommand*>> messageDialogCommands;
messageDialogFactory->CreateWithTitle(message.Get(), title.Get(), messageDialog.GetAddressOf());
messageDialog->get_Commands(messageDialogCommands.GetAddressOf());
// Attach commands
Microsoft::WRL::ComPtr<ABI::Windows::UI::Popups::IUICommandFactory> commandFactory;
Microsoft::WRL::Wrappers::HStringReference commandFactoryId(RuntimeClass_Windows_UI_Popups_UICommand);
Windows::Foundation::GetActivationFactory(commandFactoryId.Get(), commandFactory.GetAddressOf());
CInvokeHandler commandListener;
commandFactory->CreateWithHandler(labelDebug.Get(), &commandListener, commandListener.m_DebugCmd.GetAddressOf());
commandFactory->CreateWithHandler(labelIgnore.Get(), &commandListener, commandListener.m_IgnoreCmd.GetAddressOf());
commandFactory->CreateWithHandler(labelExit.Get(), &commandListener, commandListener.m_ExitCmd.GetAddressOf());
messageDialogCommands->Append(commandListener.m_DebugCmd.Get());
messageDialogCommands->Append(commandListener.m_IgnoreCmd.Get());
messageDialogCommands->Append(commandListener.m_ExitCmd.Get());
// Show dialog
Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::UI::Popups::IUICommand*>> showOperation;
messageDialog->ShowAsync(showOperation.GetAddressOf());
// ... and wait for the user to choose ...?
E ora sono bloccato qui. Se faccio solo uno spin-wait per attivare il callback, sto entrando in un ciclo infinito e la finestra del messaggio non viene mostrata affatto (almeno quando chiamo dal thread UI). Se continuo l'esecuzione, sto perdendo la possibilità di innescare un breakpoint nella posizione corretta.
Quindi quello che sto cercando è un modo per forzare un ridisegno o "busy-wait" per la chiamata asincrona per finire (come "attendere messadeDialog-> ShowAsync()"). So che potrei usare managed-C++, ma vorrei evitarlo :)
Grazie per la risposta dettagliata. Immagino che questo mi terrà impegnato per qualche tempo :) – mmpause