标签: c++-cx

在C++/CX中实现异步延迟

我正在尝试编写一个函数,在给定的秒数和回调的情况下,在给定的秒数后运行回调.回调不必在同一个线程上.目标语言是C++/CX.

我尝试使用Windows :: System :: Threading :: ThreadPoolTimer,但结果是内存访问异常.问题似乎是无法从计时器正在运行其回调的托管线程访问回调实现(在本机C++中).

ref class TimerDoneCallback {
private:
    function<void(void)> m_callback;
public:
    void EventCallback(ThreadPoolTimer^ timer) {
        m_callback(); // <-- memory exception here
    }
    TimerDoneCallback(function<void(void)> callback) : m_callback(callback) {}
};
void RealTimeDelayCall(const TimeSpan& duration, function<void(void)> callback) {
    auto t = ref new TimerDoneCallback(callback);
    auto e = ref new TimerElapsedHandler(t, &TimerDoneCallback::EventCallback);
    ThreadPoolTimer::CreateTimer(e, duration);
}
void Test() {
    RealTimeDelayCall(duration, [](){}); //after a delay, run 'do nothing'
}
Run Code Online (Sandbox Code Playgroud)

我不想创建一个线程并在其上休眠,因为可能存在许多并发延迟.

time interop native callback c++-cx

5
推荐指数
1
解决办法
2126
查看次数

CoreWindow::GetCurrentForThread() 始终为 NULL

我正在尝试CoreDispatcher在 Windows Phone 8 上获取 C++ 版本,以便我可以将工作项提交到 UI 线程调度程序,以便我可以更新 UI 线程上的 UI 元素。然而,当我打电话时CoreWindow::GetCurrentForThread(),我就NULL回来了。文档中指出 WP8 支持此功能。只要我获取NULL当前窗口,我就无法Dispatcher从中获取当前;有谁知道如何在 WP8 上获取当前的 Dispatcher?

windows-runtime c++-cx windows-phone-8

5
推荐指数
1
解决办法
3479
查看次数

列表视图选择显示,没有填充,也没有选中标记

我有这个在代码中XAML显示一个.在将被用作一个选择菜单.ListViewC++/CXListView

<ListView x:Name="itemsListView"
 ItemsSource="{Binding Source={StaticResource MenuDataSourceCVS}}"
 HorizontalAlignment="Stretch"
 Width="230"
 Margin="0,45,0,0"
 VerticalAlignment="Top"
 Grid.Row="1"
 SelectionChanged="itemsListView_SelectionChanged" SelectionMode="Single"
 HorizontalContentAlignment="Stretch" VerticalContentAlignment="Stretch"
 FontFamily="Global User Interface">
 <ListView.ItemTemplate>
    <DataTemplate>
        <StackPanel Orientation="Horizontal" Height="40" Width="230">
            <TextBlock Text="{Binding Name}"
                Margin="10,5" Width="150" Height="30"
                HorizontalAlignment="Stretch"
                VerticalAlignment="Stretch"/>
            <Border Height="30" Width="30" Margin="5">
                <Image Source="{Binding ImageSrc}" Stretch="Fill"/>
            </Border>
        </StackPanel>
    </DataTemplate>
 </ListView.ItemTemplate>
</ListView>
Run Code Online (Sandbox Code Playgroud)

如下图所示,选择不会占据所有列,并在选中时显示复选标记.

带有复选标记和填充的ListView选择

有没有办法消除这种填充和复选标记?

listview windows-8 windows-runtime c++-cx winrt-xaml

5
推荐指数
1
解决办法
4730
查看次数

将变量值打印到控制台 Visual C++ windows 商店现代 UI 应用程序

我刚刚开始学习 C++/XAML windows 商店应用程序开发,但在我的生活中,我找不到一种将变量值打印到 VS2012 中的“输出”窗口的好方法。

Debug.WriteLine()Windows 应用商店应用程序似乎不存在,除了OutputDebugString()无法用于打印变量值(没有一些繁重的格式)之外,我找不到其他打印方法。

是否有一种简单的方法来打印示例行:

鼠标位置 X:12

例如,其中 12 是来自 的整数MouseDelta

谢谢你的时间,

雨披

windows visual-studio-debugging windows-8 c++-cx windows-store-apps

5
推荐指数
1
解决办法
4259
查看次数

如何在 Win32 桌面应用程序中使用自定义 WinRT 库?

我的基于 Win32 的桌面应用程序中有一个 WinRT 类(C++/CX 引用类)。它访问 WinRT API 并且工作得很好。我使用本指南来让它工作。现在我试图将此类放入桌面应用程序可以使用的库中。我在这方面遇到了一些麻烦。这是我在 Visual Studio 2013 中所做的:

  1. 通过选择“已安装”>“模板”>“Visual C++”>“商店应用程序”>“Windows 应用程序”>“DLL (Windows)”创建了一个新项目。
  2. 将此新的 DLL 项目添加到包含我的桌面应用程序的解决方案中。
  3. 添加了对 DLL 项目的引用
  4. “配置属性”>“C/C++”>“常规”>“其他 #using 目录”中,我添加了 DLL 项目构建 .winmd 文件的目录。
  5. 在桌面应用程序的 .cpp 文件中,我添加了:
#using <MyLib.winmd>
#using <Windows.winmd>
#using <Platform.winmd>

[MTAThread] // initializes WinRT runtime
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow) {
    MyWinRTClass^ myObject = ref new MyWinRTClass();
}
Run Code Online (Sandbox Code Playgroud)

智能感知可以工作,我编写了代码来实例化库中的类。桌面应用程序已构建,但当它运行时我得到:

MyDesktopApp.exe 中 0x76494598 处的首次机会异常:Microsoft C++ 异常:Platform::ClassNotRegisteredException ^ …

dll windows-8 windows-runtime c++-cx

5
推荐指数
1
解决办法
2472
查看次数

UWP/WinRT:如何保存然后恢复简单的文本框以从终止状态恢复?

在描述 Windows 10 UWP 应用程序生命周期的文档中,它指出:

用户现在希望您的应用程序在设备上执行多任务时能够记住其状态。例如,他们希望页面滚动到相同的位置,并且所有控件都处于与以前相同的状态。通过了解启动、挂起和恢复的应用程序生命周期,您可以提供这种无缝行为。

然而,似乎没有太多关于如何实现这一目标的文档。我认为所有内容都是由应用程序开发人员手动保存的,然后在恢复时使用应用程序挂起时隐藏的任​​何数据从头开始重新创建,所有这些都是为了造成应用程序的确切内存状态从未改变的错觉。

我试图仅使用一个最小的示例(一个仅包含 TextBox 的 XAML 页面)来解决这个问题。但即使在这种情况下,我还是有点难以理解如何实现目标。我将提供更一般的想法,但我的具体问题只是如何保存然后恢复一个简单的文本框以从终止状态恢复?我正在使用 C++/CX 工作,但会寻求我能得到的任何帮助。

到目前为止,我对此的想法如下:

  • 显然,至少必须保存 TextBox 的文本。
    • 这可以保存到ApplicationData::Current->LocalSettings.
    • 我立即看到的一个问题是,我上面引用的有关生命周期的文档指出,应用程序必须在挂起信号或面临终止后的 5 秒内完成保存。文本框可能会保存大量数据,导致在繁忙的 IO 情况下可能会导致保存被切断,特别是如果我们开始扩展到微不足道的单个 TextBox 情况之外。
    • 幸运的是,该文档指出,“我们建议您为此目的使用应用程序数据 API,因为它们保证在应用程序进入挂起状态之前完成。有关详细信息,请参阅使用 UWP 应用程序访问应用程序数据。” 不幸的是,当您点击该链接时,没有任何相关内容提供更多详细信息,而且我在 API 中找不到任何记录此行为的内容。通过保存到ApplicationData::Current->LocalSettings我们是否可以避免因数据损坏或丢失而被切断?
  • 一旦满足了最低要求,接下来我们可能需要额外的内容,例如光标和窗口位置。
    • 我们可以使用 获取光标位置TextBox->SelectionStart,据我所知,返回当前光标位置的用法在 API 中没有记录。这似乎也很适合存储为intinto ApplicationData::Current->LocalSettings
    • 我们如何获取、保存和恢复TextBox窗口的滚动位置?
  • 现在我们已经有了额外的东西,那么困难的东西怎么样,比如撤消历史记录?我认为这是不可能的,因为我在 Stackoverflow 上关于如何访问 TextBox 的撤消功能的问题没有得到答案。尽管如此,如果他们切换到另一个应用程序,然后回来认为由于我们实现了完美且无缝的终止恢复,该应用程序从未关闭,并且他们的撤消历史记录已被清除,那么用户体验似乎确实很差。
  • 是否还需要为文本框保存其他内容才能创建理想的用户体验?我错过了什么还是有更简单的方法来完成这一切?像 Microsoft 的 Edge 浏览器这样的东西如何处理复杂的情况,其中有数十个选项卡、表单输入、滚动位置等都需要在 5 秒内保存?

textbox windows-runtime c++-cx uwp

5
推荐指数
1
解决办法
2681
查看次数

Windows 上的递归临界区不起作用

我有以下用 C++/CX 编写的代码:

TaskPool^ TaskPool::Instance::get()
{
    // Prevent acquiring the critical section for a static initialization
    // after it's been properly initialized.
    if (TaskPool::_instance == nullptr) {

        static CRITICAL_SECTION section;

        CriticalSection lock(&section);

        if (TaskPool::_instance == nullptr) {
            _instance = ref new TaskPool();
            InitializeCriticalSection(GetCriticalSection());
        }
    }
    return _instance;
}

TaskPool^ TaskPool::_instance;
CRITICAL_SECTION TaskPool::_criticalSection;

void Threading::TaskPool::TaskRun(Concurrency::task<void> & task)
{
    Log::LogMessage(this->GetType()->FullName, Level::Debug, "TaskRun [entering]");
    EnterCriticalSection(GetCriticalSection());
    Log::LogMessage(this->GetType()->FullName, Level::Debug, "TaskRun [entered]");

    create_task(task).then([this]() {
        Log::LogMessage(this->GetType()->FullName, Level::Debug, "TaskRun [leaving]");
        LeaveCriticalSection(GetCriticalSection());
        Log::LogMessage(this->GetType()->FullName, Level::Debug, "TaskRun [left]");
    });
}
Run Code Online (Sandbox Code Playgroud)

TaskPool …

multithreading critical-section c++-cx

5
推荐指数
0
解决办法
263
查看次数

从 C# 使用 C++/WinRT 组件

我有一个用 C++/CX 编写的项目(动态库),该项目由用 C# 编写的 Windows 10 通用应用程序(针对 x86 和 ARM32)使用。
我想将库重写为C++/WinRT,以便使用普通 C++。

问题 1:是否可以创建 C++/WinRT DLL 并从 C# 中使用它?
问题 2:如何设置 C++/WinRT 项目以使其能够从商店应用程序中使用?

c# windows-runtime c++-cx winrt-component c++-winrt

5
推荐指数
1
解决办法
2073
查看次数

如何正确从 SoftwareBitmap (UWP) 中释放 BitmapBuffer?

我很难在 UWP 上的 C++/CX 代码中正确释放BitmapBuffer锁定的方法。SoftwareBitmap.LockBuffer()

基本代码如下所示(这是来自 Microsoft 的 OpenCV 桥示例,可在此处获取)。

bool OpenCVHelper::GetPointerToPixelData(SoftwareBitmap^ bitmap, unsigned char** pPixelData, unsigned int* capacity)
{
   BitmapBuffer^ bmpBuffer = bitmap->LockBuffer(BitmapBufferAccessMode::ReadWrite);
   IMemoryBufferReference^ reference = bmpBuffer->CreateReference();

   ComPtr<IMemoryBufferByteAccess> pBufferByteAccess;
   if ((reinterpret_cast<IInspectable*>(reference)->QueryInterface(IID_PPV_ARGS(&pBufferByteAccess))) != S_OK)
   {
    return false;
   }

   if (pBufferByteAccess->GetBuffer(pPixelData, capacity) != S_OK)
   {
    return false;
   }
   return true;
}
Run Code Online (Sandbox Code Playgroud)

然后该缓冲区 ( pPixelData) 用于初始化cv:Mat对象(浅拷贝)。并且永远不会被释放。

连续调用LockBuffer()同一SoftwareBitmap对象会引发异常:

Platform::AccessDeniedException ^ 位于内存位置 0x00000002CEEFDCC0。HRESULT:0x80070005 访问被拒绝。WinRT 信息:已获取位图共享锁

如何正确释放这个缓冲区?特别是在 C++/CX 中?

我尝试保留引用,以便在不再需要时释放它。在 C++/CX 中,Dispose() 或 …

windows c++-cx windows-10-iot-core uwp windows-10-universal

5
推荐指数
1
解决办法
985
查看次数

无法将 WinRT/C++ 组件加载到我的 UWP/C# 应用程序

我需要将 WebRTC c++ 库包装到 WinRT 组件中,并从我的 UWP/C# 应用程序中使用它。有一篇很好的文章how to use native c++ in uwp描述了我遵循的所有集成步骤。简要地:

  • 我已经创建了 Dll/C++DLL1库并链接了我的静态库libwebrtc_full.a。打了所有必要的电话
  • 然后,我在我的 WinRT/C++ 项目中引用了 DLLWindowsRuntimeComponent1MyClass成功创建了公共引用类,这使得所有必要的调用来自DLL1
  • 我的 UWP 应用程序正确App1查看MyClass及其公共方法,App1引用了 WindowsRuntimeComponent。

在运行应用程序时,只要我尝试使用在 WindowsRuntimeComponent1

The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
Run Code Online (Sandbox Code Playgroud)

我创建并上传了一个示例项目以将我的问题重现到GDrivelibwebrtc.a在示例项目中也包含了我的静态数据,以防它是问题的根本原因。

我已经过上这样类似的问题去了,最相似的我的问题是这样的一个。不同之处在于我引用了该项目并且仍然得到相同的异常。

编辑1:

这是MyClass这样的:

namespace WindowsRuntimeComponent1
{
    public ref class MyClass sealed
    {
    public:
        MyClass(int sampleRate);
        virtual ~MyClass(); …
Run Code Online (Sandbox Code Playgroud)

c# c++ c++-cx winrt-component uwp

5
推荐指数
0
解决办法
168
查看次数