我正在尝试编写一个函数,在给定的秒数和回调的情况下,在给定的秒数后运行回调.回调不必在同一个线程上.目标语言是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)
我不想创建一个线程并在其上休眠,因为可能存在许多并发延迟.
我正在尝试CoreDispatcher在 Windows Phone 8 上获取 C++ 版本,以便我可以将工作项提交到 UI 线程调度程序,以便我可以更新 UI 线程上的 UI 元素。然而,当我打电话时CoreWindow::GetCurrentForThread(),我就NULL回来了。文档中指出 WP8 支持此功能。只要我获取NULL当前窗口,我就无法Dispatcher从中获取当前;有谁知道如何在 WP8 上获取当前的 Dispatcher?
我有这个在代码中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)
如下图所示,选择不会占据所有列,并在选中时显示复选标记.

有没有办法消除这种填充和复选标记?
我刚刚开始学习 C++/XAML windows 商店应用程序开发,但在我的生活中,我找不到一种将变量值打印到 VS2012 中的“输出”窗口的好方法。
Debug.WriteLine()Windows 应用商店应用程序似乎不存在,除了OutputDebugString()无法用于打印变量值(没有一些繁重的格式)之外,我找不到其他打印方法。
是否有一种简单的方法来打印示例行:
鼠标位置 X:12
例如,其中 12 是来自 的整数MouseDelta。
谢谢你的时间,
雨披
windows visual-studio-debugging windows-8 c++-cx windows-store-apps
我的基于 Win32 的桌面应用程序中有一个 WinRT 类(C++/CX 引用类)。它访问 WinRT API 并且工作得很好。我使用本指南来让它工作。现在我试图将此类放入桌面应用程序可以使用的库中。我在这方面遇到了一些麻烦。这是我在 Visual Studio 2013 中所做的:
#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 ^ …
在描述 Windows 10 UWP 应用程序生命周期的文档中,它指出:
用户现在希望您的应用程序在设备上执行多任务时能够记住其状态。例如,他们希望页面滚动到相同的位置,并且所有控件都处于与以前相同的状态。通过了解启动、挂起和恢复的应用程序生命周期,您可以提供这种无缝行为。
然而,似乎没有太多关于如何实现这一目标的文档。我认为所有内容都是由应用程序开发人员手动保存的,然后在恢复时使用应用程序挂起时隐藏的任何数据从头开始重新创建,所有这些都是为了造成应用程序的确切内存状态从未改变的错觉。
我试图仅使用一个最小的示例(一个仅包含 TextBox 的 XAML 页面)来解决这个问题。但即使在这种情况下,我还是有点难以理解如何实现目标。我将提供更一般的想法,但我的具体问题只是如何保存然后恢复一个简单的文本框以从终止状态恢复?我正在使用 C++/CX 工作,但会寻求我能得到的任何帮助。
到目前为止,我对此的想法如下:
ApplicationData::Current->LocalSettings.ApplicationData::Current->LocalSettings我们是否可以避免因数据损坏或丢失而被切断?TextBox->SelectionStart,据我所知,返回当前光标位置的用法在 API 中没有记录。这似乎也很适合存储为intinto ApplicationData::Current->LocalSettings。我有以下用 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(§ion);
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 …
我有一个用 C++/CX 编写的项目(动态库),该项目由用 C# 编写的 Windows 10 通用应用程序(针对 x86 和 ARM32)使用。
我想将库重写为C++/WinRT,以便使用普通 C++。
问题 1:是否可以创建 C++/WinRT DLL 并从 C# 中使用它?
问题 2:如何设置 C++/WinRT 项目以使其能够从商店应用程序中使用?
我很难在 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() 或 …
我需要将 WebRTC c++ 库包装到 WinRT 组件中,并从我的 UWP/C# 应用程序中使用它。有一篇很好的文章how to use native c++ in uwp描述了我遵循的所有集成步骤。简要地:
DLL1库并链接了我的静态库libwebrtc_full.a。打了所有必要的电话WindowsRuntimeComponent1并MyClass成功创建了公共引用类,这使得所有必要的调用来自DLL1App1查看MyClass及其公共方法,App1引用了 WindowsRuntimeComponent。在运行应用程序时,只要我尝试使用在 WindowsRuntimeComponent1
The specified module could not be found.
(Exception from HRESULT: 0x8007007E)
Run Code Online (Sandbox Code Playgroud)
我创建并上传了一个示例项目以将我的问题重现到GDrive我libwebrtc.a在示例项目中也包含了我的静态数据,以防它是问题的根本原因。
我已经过上这样类似的问题去了,最相似的我的问题是这样的一个。不同之处在于我引用了该项目并且仍然得到相同的异常。
编辑1:
这是MyClass这样的:
namespace WindowsRuntimeComponent1
{
public ref class MyClass sealed
{
public:
MyClass(int sampleRate);
virtual ~MyClass(); …Run Code Online (Sandbox Code Playgroud)