有没有办法在仍在处理事件的同时暂停执行 UWP 控制台应用程序的主线程?
Is there a way to pause execution a UWP console app's main thread while still handling events?
我正在制作事件驱动的应用程序原型(目前为 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");
}
我正在制作事件驱动的应用程序原型(目前为 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");
}