Есть ли способ приостановить выполнение основного потока консольного приложения UWP, продолжая обрабатывать события?

Я создаю прототип приложения (на данный момент консольное приложение UWP), которое управляется событиями. Приложение работает с вновь созданными файлами в системе, и я использую StorageFileQueryResult.ContentsChanged, чтобы следить за ними, но не уверен, что мне следует делать, чтобы поддерживать процесс в рабочем состоянии во время ожидания событий. В настоящее время я использую бесконечный цикл while (который работает). Конечно, должен быть способ лучше?

Я использую c ++ / winrt, но применимо любое общее решение UWP.

Пример кода, вырезанный ниже:

int main()
{
    winrt::init_apartment();

    Windows::Storage::StorageFolder folder{ Windows::Storage::StorageFolder::GetFolderFromPathAsync(SOME_PATH).get() };
    auto queryOptions = Windows::Storage::Search::QueryOptions(Windows::Storage::Search::CommonFileQuery::DefaultQuery, NULL);
    auto query = folder.CreateFileQueryWithOptions(queryOptions);
    query.ContentsChanged(Query_ContentsChanged);
    
    auto files = query.GetFilesAsync().get();
    for (auto const& f : files) {
        std::wcout << f.Name().c_str() << std::endl;
    }

    while (1) {} // Keep process alive
}

person ghn    schedule 04.03.2021    source источник
comment
Это действительно консольное приложение UWP или консольное приложение, использующее типы среды выполнения Windows?   -  person IInspectable    schedule 05.03.2021


Ответы (1)


Обычно вы можете использовать getchar() или system("pause"), чтобы заблокировать поток консоли.

Другой способ, который вы можете использовать, - это блокировка. Пожалуйста, проверьте следующий код:

#include <iostream>
#include <condition_variable>
#include <mutex>

std::condition_variable cv;
std::mutex mtx;

int main()
{
    winrt::init_apartment();

    std::unique_lock<std::mutex> m(mtx);

    Windows::Storage::StorageFolder folder{ Windows::Storage::StorageFolder::GetFolderFromPathAsync(L"C:\\test1").get() };
    auto queryOptions = Windows::Storage::Search::QueryOptions(Windows::Storage::Search::CommonFileQuery::DefaultQuery, NULL);
    auto query = folder.CreateFileQueryWithOptions(queryOptions);
    query.ContentsChanged(Query_ContentsChanged);

    auto files = query.GetFilesAsync().get();

    cv.wait(m);
    //getchar();
    //system("pause");

}
person YanGu    schedule 05.03.2021