小编Max*_*ich的帖子

使用FormData上传JavaScript Blob

我在将使用javascript创建的blob上传到我的服务器时遇到问题.基本思想是用户上传图像,并在javascript中我裁剪图像并在传输之前对其进行下采样.

图像处理工作正常,但上传本身无法正常工作.以下是执行从canvas到blob的上传和转换的代码

function uploadCanvasData()
{
    var canvas = $('#ImageDisplay').get(0);
    var dataUrl = canvas.toDataURL("image/jpeg");

    var blob = dataURItoBlob(dataUrl);

    var formData = new FormData();
    formData.append("file", formData);

    var request = new XMLHttpRequest();
    request.onload = completeRequest;

    request.open("POST", "IdentifyFood");
    request.send(formData);
}

function dataURItoBlob(dataURI)
{
    var byteString = atob(dataURI.split(',')[1]);

    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]

    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++)
    {
        ia[i] = byteString.charCodeAt(i);
    }

    var bb = new Blob([ab], { "type": mimeString }); …
Run Code Online (Sandbox Code Playgroud)

ajax html5 file-upload multipartform-data xmlhttprequest

25
推荐指数
1
解决办法
3万
查看次数

C++/CLI资源管理混淆

我对C++/CLI中的资源管理非常困惑.我认为我有一个句柄(没有任何双关语),但我偶然发现了整个auto_gcroot<T>课程,同时查看了头文件,导致谷歌搜索,然后是阅读文档的更好部分,现在混乱.所以我想我会转向社区.

我的问题涉及auto_handle/stack语义和auto_gcroot/gcroot之间的区别.

  1. auto_handle:我的理解是这将清理托管函数中创建的托管对象.我的困惑是,垃圾收集者不应该为我们这样做吗?这不是托管代码的重点吗?更具体:

    //Everything that follows is managed code
    void WillThisLeak(void)
    {
        String ^str = gcnew String ^();
        //Did I just leak memory? Or will GC clean this up? what if an exception is thrown?
    }
    
    void NotGoingToLeak(void)
    {
        String ^str = gcnew String^();
        delete str;
        //Guaranteed not to leak, but is this necessary? 
    }
    
    void AlsoNotGoingToLeak(void)
    {
        auto_handle<String ^> str = gcnew String^();
        //Also Guaranteed not to leak, but is this necessary? 
    }
    
    void DidntEvenKnowICouldDoThisUntilToday(void)
    {
        String …
    Run Code Online (Sandbox Code Playgroud)

interop memory-management c++-cli

14
推荐指数
1
解决办法
3687
查看次数

C++/CLI和CMake

我正在尝试使用cmake设置C++/CLI项目.我在visual studio 2010上取得了成功,但我现在正在使用一个需要visual studio 2008的传统解决方案.在visual studio 2010中,设置我的cmake就足够了:

set_target_properties(${PROJECT_NAME} PROPERTIES VS_DOTNET_REFERENCES "${CMAKE_CURRENT_SOURCE_DIR}/../OrionMaster/3rdParty/GMap.NET.Core.dll;System;System.Core;System.Data;System.Drawing;System.Xml;WindowsBase")
set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "/clr /EHa")
set_target_properties(${PROJECT_NAME} PROPERTIES DEBUG_POSTFIX "d")

if(CMAKE_CXX_FLAGS_DEBUG MATCHES "/RTC1")
   string(REPLACE "/RTC1" " " CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
endif()

if(CMAKE_CXX_FLAGS MATCHES "/EHsc")
   string(REPLACE "/EHsc" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endif()
Run Code Online (Sandbox Code Playgroud)

当我在visual studio 2010下检查项目时,我可以看到所有引用和"公共语言运行时支持"已打开.当我在visual studio 2008中尝试它时,我没有看到任何引用,并且项目设置为"No Common Language Runtime Support"如果我再查看编译器选项,我可以看到/ clr正在传递给编译器.但是我仍然会遇到很多编译器错误,可能是因为它缺少引用.有没有人知道如何正确设置它?

.net c++-cli cmake

10
推荐指数
1
解决办法
5636
查看次数

OpenCV迭代列

我试图遍历矩阵的列(例如,它连接成矩阵的一堆列向量,我想分别对每个列向量进行操作).使用for循环很容易做到这一点:

for(int n = 0; n < mat.cols; n++)
{
    cv::Mat c = mat.col(n);
    // do stuff to c
}
Run Code Online (Sandbox Code Playgroud)

但是如果可能的话我想使用迭代器这样做,以便我可以使用std :: accumulate或std :: transform来简化我的代码.

所以我基本上都在寻找类似的东西

for each Mat c in mat.columns
Run Code Online (Sandbox Code Playgroud)

Mat具有begin<>end<>功能,但据我所知,它只能用于迭代单个元素.

这可以以某种方式完成吗?

为了清楚我想写

cv::Mat input;

cv::Mat output = std::accumulate(input.begincols(), input.endcols(), cv::Mat::zeros(n,k,CV_64F),
[](const cv::Mat &acum, const cv::Mat &column) { return acum + column * 5; });
Run Code Online (Sandbox Code Playgroud)

举个简单的例子.

更新:

所以既然没有得到回答,如果有人有一个本土解决方案来提供这样的迭代器,我会看看,否则如果我有机会我可能会自己调查一下

c++ opencv iterator

10
推荐指数
1
解决办法
1587
查看次数

Clang构建错误

我正在尝试在Ubuntu 16.04上构建clang trunk,无论我尝试什么,我都会遇到构建错误.首先,我对gcc 5.4构建了llvm/clang/libc ++/libc ++ abi,​​这很好用.现在我正在尝试使用我刚刚构建的clang来重建llvm/clang/libc ++/libc ++ abi.此操作失败,并显示以下错误消息:

    [162/4396] Linking CXX executable bin/llvm-tblgen FAILED: 
: && /usr/local/bin/clang++ -stdlib=libc++ 
-fPIC
 -fvisibility-inlines-hidden -Wall -W -Wno-unused-parameter 
-Wwrite-strings -Wcast-qual -Wmissing-field-initializers 
-pedantic -Wno-long-long -Wcovered-switch-default 
-Wnon-virtual-dtor -Wdelete-non-virtual-dtor 
-Werror=date-time -std=c++11 -fcolor-diagnostics 
-ffunction-sections -fdata-sections -O3 -DNDEBUG  
-lc++ -lc++abi -Wl,-allow-shlib-undefined    
-Wl,-O3 -Wl,--gc-sections 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/AsmMatcherEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/AsmWriterEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/AsmWriterInst.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/Attributes.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CallingConvEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeEmitterGen.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenDAGPatterns.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenInstruction.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenMapTable.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenRegisters.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenSchedule.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CodeGenTarget.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DAGISelEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcherEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcherGen.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcherOpt.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DAGISelMatcher.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DFAPacketizerEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/DisassemblerEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/FastISelEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/FixedLenDecoderEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/InstrInfoEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/IntrinsicEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/OptParserEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/PseudoLoweringEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/RegisterInfoEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/SearchableTableEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/SubtargetEmitter.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/TableGen.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/X86DisassemblerTables.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/X86ModRMFilters.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/X86RecognizableInstr.cpp.o 
utils/TableGen/CMakeFiles/obj.llvm-tblgen.dir/CTagsEmitter.cpp.o  
-o bin/llvm-tblgen …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang libc++

7
推荐指数
1
解决办法
1894
查看次数

内核构建缓存/非确定性

我运行一个CI服务器,用于构建自定义Linux内核.CI服务器功能不强,每个构建的时间限制为3h.为了在这个限制内工作,我有了使用ccache缓存内核构建的想法.我希望我可以在每个次要版本发布时创建一个缓存,并将其重新用于补丁版本,例如我有一个我为4.18制作的缓存,我想用于所有4.18.x内核.

删除构建时间戳后,这适用于我正在构建的确切内核版本.对于上面引用的4.18内核,在CI上构建它会提供以下统计信息:

$ ccache -s
cache directory                     
primary config                      
secondary config      (readonly)    /etc/ccache.conf
stats zero time                     Thu Aug 16 14:36:22 2018
cache hit (direct)                 17812
cache hit (preprocessed)              38
cache miss                             0
cache hit rate                    100.00 %
called for link                        3
called for preprocessing           29039
unsupported code directive             4
no input file                       2207
cleanups performed                     0
files in cache                     53652
cache size                           1.4 GB
max cache size                       5.0 GB
Run Code Online (Sandbox Code Playgroud)

缓存命中率100%和一小时完成构建,梦幻般的统计数据和预期.

不幸的是,当我尝试构建4.18.1时,我得到了

cache directory                     
primary config                      
secondary config      (readonly)    /etc/ccache.conf
stats …
Run Code Online (Sandbox Code Playgroud)

linux linux-kernel ccache

6
推荐指数
1
解决办法
284
查看次数

LoadLibrary 193

我正在创建一个C++/CLI DLL,它将被加载到遗留的c ++应用程序中.传统应用程序通过对LoadLibrary的传统调用来完成此操作.应用程序和C++/CLI dll都以64位模式编译.

当LoadLibrary调用发生时,它会因错误193而失败.这通常意味着某些非64位组件正在尝试加载.当我在visual studio 2010中查看dll加载输出时,我看到加载mscoree.dll时发生了故障(确切地说,我看到我的dll加载,然后mscoree加载,然后mscoree卸载,然后我的dll卸载,然后返回错误).特别是C:\ Windows\System32\mscoree.dll正在加载,当我检查这个mscoree.dll时,我发现它的目标是I386.

如何确保我的应用程序将链接到正确的mscoree.dll?我知道这可以用清单来完成,但我找不到任何关于设置清单的好信息.理想的解决方案是允许在32位或64位模式下编译并定位正确的mscoree.dll.

作为旁注,我发现并行文件夹中的mscoree.dll是我验证的64位模式,并将其复制到我的应用程序目录中,希望它能先获取该文件.这不起作用,仍然加载C:\ Windows\System32版本.

谢谢,

马克斯

在C++/CLI dll上输出CorFlags.exe

Microsoft (R) .NET Framework CorFlags Conversion Tool.  Version  4.0.30319.1
Copyright (c) Microsoft Corporation.  All rights reserved.

Version   : v4.0.30319
CLR Header: 2.5
PE        : PE32+
CorFlags  : 16
ILONLY    : 0
32BIT     : 0
Signed    : 0
Run Code Online (Sandbox Code Playgroud)

在C:\ System32\mscoree.dll上输出pedump.exe

PS C:\Windows\System32> pedump.exe .\mscoree.dll
Dump of file .\MSCOREE.DLL

File Header
  Machine:                      014C (I386)
  Number of Sections:           0004
  TimeDateStamp:                4B90752B -> Thu Mar 04 22:06:19 2010
  PointerToSymbolTable: …
Run Code Online (Sandbox Code Playgroud)

64-bit c++-cli manifest mscorlib

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

C++/CLI字符串互操作

我正在为本机c ++类开发C++/CLI包装器.C++/CLI包装器正在WPF应用程序中使用.我在尝试编组字符串时遇到了一个奇怪的问题.

WPF应用程序将System::String对象传递给我的包装器.该包装然后转换System::Stringstd::string了本机类的期望.这一切都很顺利,但是一旦我将字符串传递给本机对象,它就是空的.

这是一些相关的代码

WPF事件处理程序(C#)

private void tbInputConfig_TextChanged(object sender, TextChangedEventArgs e)
{
    _OrionBasicApp.ConfigTemplateFile = tbInputConfig.Text;
}
Run Code Online (Sandbox Code Playgroud)

包装类中的属性(C++/CLI)

void BasicApp::ConfigTemplateFile::set(String ^value)
{
    std::string val = marshal_as<std::string>(value);
    _NativeApp->setConfigTemplateFile(val);
}
Run Code Online (Sandbox Code Playgroud)

本地代码(C++)

void Basic_App::setConfigTemplateFile(const std::string& template_file)
{
   m_gParams.configTemplateFile = template_file;
}
Run Code Online (Sandbox Code Playgroud)

所以,当我在WPF应用程序突破和使用调试器的跟踪中,字符串对象看起来很好,在std::string val编组看起来不错,但参数template_filesetConfigFile函数是一个空字符串.当我退出本机函数时,我可以看到std::string val变量看起来仍然很好.

我尝试过使用Marshal::StringToHGlobalAnsi函数,它会产生相同的结果.我已经尝试更改本机函数以获取字符串的副本而不是引用,这会产生关于无效内存块的异常(如果请求,我将发布确切的消息).我试过在堆上分配字符串,没有运气.

现在为踢球者:本机代码是用Microsoft Visual Studio 2008编译的,而包装器+ wpf代码是用2010编译的.我希望这不是问题,因为我们将代码库迁移到其他版本并不容易.

有任何想法吗?

UPDATE

我能够将本机代码切换到visual studio 2010,这确实解决了问题.(为什么微软必须让我的生活变得如此困难?)虽然我确实建立了系统,但是项目的主角给了我关于这个解决方案的主要麻烦(他担心它可能无法正常运行或我们将不得不切换依赖库).

那么这个问题的解决方案是不是迫使我转换Visual Studio版本?

c# string wpf interop c++-cli

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

快速视频显示WPF

我正在开发一个 WPF 应用程序,需要以快速帧速率(我们想要 30 fps)显示多个视频流。视频流是 1920x1080 原始 (RGB24) 帧(它们存储在 System.Drawing.Bitmap 中)。有谁对如何实现这一目标有任何想法?

更多细节:

  • 我们之前的尝试使用了标准的 WPF Image 控件,更改了每个帧的源。这对于单个流来说效果很好,但现在我们必须渲染多个流,它的速度变慢了。
  • 我们还尝试使用 Direct2D 来处理绘图,使用 D3D9 共享表面作为图像控件的源。虽然速度更快,但我们仍然无法获得稳定的 30 fps(随着情况备份,它在 24-32 fps 之间跳跃)。
  • 视频流进入后台线程,然后被编组(使用窗口的调度程序)到正确的 UI 线程进行绘制。然后所有的绘制都在 UI 线程上完成。我们还尝试为每个窗口提供自己的线程。

如果有人想看的话,我可以提供我们尝试过的代码示例。

谢谢!

c# wpf video performance frame-rate

3
推荐指数
1
解决办法
4279
查看次数

隐式转换为IEnumerable <T>

我有一个类用于保存从配置文件加载的值.为了使这个类更容易使用,我已经为一些基本类型设置了许多隐式转换.

我想要转换为的类型之一是IEnumerable(T).例如,如果程序员在配置文件中有这样的值

a = "1,2,3,4"
Run Code Online (Sandbox Code Playgroud)

在C#代码中,他可以写

IEnumerable<int> a = Config.a;
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想写的是这个

    public static implicit operator IEnumerable<T>(ConfigurationValue val)
    {
        string value = val;

        string[] parts = value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);

        List<T> convertedTypes = new List<T>();

        foreach (string part in parts)
        {
            T converted = Convert.ChangeType(part.Trim(), typeof(T));
            convertedTypes.Add(converted);
        }

        return convertedTypes;
    }
Run Code Online (Sandbox Code Playgroud)

但这给了我语法错误,T未定义.有没有办法定义这样的转换或是否有特殊的语法?

另外,对于记录,我在.Net Framework 4.0中使用C#4.0

c# generics ienumerable implicit-conversion c#-4.0

2
推荐指数
2
解决办法
2537
查看次数