微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

有没有办法在仍然处理事件的同时暂停执行 UWP 控制台应用程序的主线程?

如何解决有没有办法在仍然处理事件的同时暂停执行 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
}

解决方法

通常,您可以使用 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");

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。