小编Dan*_*röm的帖子

设置Form.KeyPreview = true的缺点?

我想知道Form.KeyPreview属性实际上有什么用处?为什么它存在以及通过将其设置为true来"冒险"?我想它必定有一些负面影响 - 否则根本不存在(或者至少默认为真)?

编辑:我非常清楚地知道什么它.我问为什么.为什么我必须将其设置为true才能使键盘事件触发?为什么键盘事件总是不会触发表单.什么不仅仅是标准行为?

我问的特殊原因是:我刚刚在我的应用程序的基本形式中设置了KeyPreview = true,其他所有形式都继承自.我是否有任何令人讨厌的惊喜?

.net windows winforms

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

64位.Net应用程序中的内存限制?

在我的笔记本电脑上,运行64位Windows 7和2 Gb可用内存(由任务管理器报告),我能够做到:

var x = new Dictionary<Guid, decimal>( 30 * 1024 *1024 );
Run Code Online (Sandbox Code Playgroud)

没有一台拥有更多RAM的计算机,我想知道这是否会扩展,以便在具有4 Gb可用内存的计算机上,我将能够分配60M项而不是"仅"30M等等?

或者还有其他限制(.Net和/或Windows),在我能够消耗所有可用RAM之前我会遇到这些限制吗?

更新:好的,所以我不允许分配大于2 Gb的单个对象.知道这一点很重要!但是我当然很想知道我是否能够通过像这样分配2 Gb块来充分利用所有内存:

  var x = new List<Dictionary<Guid, decimal>>();
  for ( var i = 0 ; i < 10 ; i++ )
    x.Add( new Dictionary<Guid, decimal>( 30 * 1024 *1024 ) );
Run Code Online (Sandbox Code Playgroud)

如果计算机有超过20Gb的可用内存,这会工作吗?

.net c# windows 64-bit memory-management

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

P/Invoke动态DLL搜索路径

我有一个现有的应用程序P/Invokes到一个DLL与应用程序本身驻留在同一目录中.

现在(由于佳能生产了最疯狂的API之一)我需要支持这个API的两个版本,并在运行时确定我应该使用哪个(旧的或新的).由于DLL具有相同的名称(第一个加载具有相同名称的其他DLL,因此只重命名第一个将无法帮助我)我必须将它们保存在不同的目录中.

因此我的问题是:我有什么选择来控制DllImport声明中给出的DLL使用的目录?

我想我可以尝试以下两个想法中的任何一个:

1)在执行第一个P/Invoke之前使用"SetDllDirectory"设置我想要的目录,然后重置它.

2)使用"LoadLibraryEx"手动加载所需的DLL,并希望这样做.

但是,有没有更多的".NET:ish方式"首先尝试?

更新:我意识到我可以在两个单独的.Net程序集中填充对DLL的所有访问权限,然后将它们中的每一个放在一个带有相应API文件的单独目录中.然后我可以动态加载正确的.Net程序集,并自动加载正确的DLL.有什么理由不行吗?

我能想到一个:我将如何调试这些东西?有可能告诉Visual Studio一个程序集(包含在我的解决方案中)应该放在一个子目录中并从那里进行调试吗?

.net c# pinvoke dllimport

13
推荐指数
1
解决办法
5147
查看次数

C++字符串内存管理

上周我在C#中写了几行代码,将一个大文本文件(300,000行)激活到一个Dictionary中.编写花了十分钟,并在不到一秒的时间内执行.

现在我将这段代码转换为C++(因为我需要在旧的C++ COM对象中).到目前为止,我已经花了两天时间.:-(虽然生产力差异本身令人震惊,但这是我需要一些建议的表现.

加载需要7秒钟,甚至更糟糕的是:之后需要花费很多时间来释放所有CStringW.这是不可接受的,我必须找到一种方法来提高性能.

有没有机会我可以分配这么多字符串而不会看到这种可怕的性能退化?

我现在的猜测是,我必须将所有文本填充到一个大型数组中,然后让我的哈希表指向此数组中每个字符串的开头并删除CStringW内容.

但在那之前,你有C++专家的建议吗?

编辑:我给自己的答案如下.我意识到这对我来说是最快的路径,也是认为正确的方向 - 更多托管代码.

c++ mfc memory-management

12
推荐指数
3
解决办法
4815
查看次数

如何删除"绿屏"肖像背景

我正在寻找一种从很多图片中自动删除(=透明)"绿色屏幕"肖像背景的方法.

我自己的尝试到目前为止......呃...不太成功.

我正在四处寻找有关该主题的任何提示,解决方案或论文.商业解决方案也很好.

在你发表评论之前说它不可能自动完成:不,不是.实际上有一家公司提供这种服务,如果我没有提出不同的解决方案,我们将使用它们.问题是他们用自己的生命保护算法,因此不会出售/许可他们的软件.相反,我们必须将所有图片FTP到处理完成的地方,然后我们将结果FTP回家.(不,他们没有在菲律宾隐藏的工资过低的工作人员手动处理这个问题,因为我们每天都在谈几千张图片 ......)但是,这种做法限制了它的用处,原因有几个.所以我真的很喜欢这样的解决方案,可以在互联网离线时立即完成.

编辑:我的"肖像"描绘了有头发的人 - 这是一个非常棘手的部分,因为绿色背景会流入头发.另一个棘手的部分是,如果有可能在背景中的绿色和人们衣服中的相同绿色之间进行distingush.我上面谈到的公司声称他们可以通过弄清楚绿色区域是否在焦点(锐利与模糊)来做到这一点.

image-processing chromakey

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

提升数学(ibeta_inv函数)不是线程安全吗?

我已经将boost的一部分 - ibeta_inv函数 - 编译成.Net 64位程序集,并且它工作得很好,直到我开始从多个线程调用它.然后它在某种程度上会返回错误的结果.

我使用此代码(C++/CLI)编写了它:

// Boost.h

#pragma once

#include <boost/math/special_functions/beta.hpp>

using namespace boost::math;

namespace Boost {

    public ref class BoostMath
    {
    public:
        double static InverseIncompleteBeta( double a, double b, double x )
        {
            return ibeta_inv(a,b,x);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

有人曾尝试过这个吗?

我没有在.Net之外尝试过这个,所以我不知道这是不是原因,但我真的不明白为什么,因为它的单线程很好.

用法(C#):

private void calcBoost(List<Val> vals)
{
    //gives WRONG results (sometimes):
    vals.AsParallel().ForAll(v => v.BoostResult = BoostMath.InverseIncompleteBeta(v.A, v.B, v.X));
    //gives CORRECT results:
    vals.ForEach(v => v.BoostResult = BoostMath.InverseIncompleteBeta(v.A, v.B, v.X));
}
Run Code Online (Sandbox Code Playgroud)

更新:从我在下面的评论中可以看出 - 我完全不确定这是一个Boost问题.也许这是一些奇怪的PLinq到C++/CLI的bug?我被废除了,以后会回来更多的事实.

.net c# boost c++-cli plinq

8
推荐指数
1
解决办法
645
查看次数

如何使用Marshal.ReleaseComObject与Win32本机函数

我正在玩这两个原生的win32函数:

    [DllImport( "oleacc.dll" )]
    public static extern int AccessibleObjectFromWindow(
            IntPtr hwnd,
            int dwObjectID,
            ref Guid refID,
            ref Accessibility.IAccessible ppvObject );
    [DllImport( "oleacc.dll" )]
    public static extern uint AccessibleChildren(
        Accessibility.IAccessible paccContainer,
        int iChildStart, 
        int cChildren,
        [Out] object[] rgvarChildren,
        out int pcObtained );
Run Code Online (Sandbox Code Playgroud)

而且我很难搞清楚我是否应该/需要在任何返回的对象上调用Marshal.ReleaseComObject.我很感激有人可以开导我这个话题!这是一个示例用法:

    Accessibility.IAccessible test(
        int hWnd,
        string accessName )
    {
        Guid guidCOM = new Guid( 0x618736E0, 0x3C3D, 0x11CF, 0x81, 0xC, 0x0, 0xAA, 0x0, 0x38, 0x9B, 0x71 );
        Accessibility.IAccessible a = null;

        AccessibleObjectFromWindow(
            new IntPtr( hWnd ),
            -4,
            ref guidCOM,
            ref …
Run Code Online (Sandbox Code Playgroud)

.net c# com interop

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

连接打开时更改SerialPort的BaudRate

我正在使用SerialPort类与外部设备进行通信.我以每秒300波特的速度开始通信,但是在初始"握手"之后,我必须切换到设备指定的波特率(通常为9600 Bps).

在增加波特率之后,我一直试图继续通信,但是我不知道为什么.这引出了我的问题:改变波特率的正确方法是什么?可以在连接打开时完成,还是应该先关闭连接?

我无法在文档中找到有关此内容的任何信息......

我已经尝试了两种方式并且在两种方式都没有成功,这让我觉得我必须遗漏一些明显的东西.

c# serial-port serial-communication

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

为什么"十进制"数据类型不闪烁?

GCHandle.Alloc拒绝使用包含"十进制"数据类型的结构来固定数组,但同时使用"double"工作正常.这是什么原因,我能以某种方式解决它吗?

我知道我可以使用unsafe/fixed来获取指向数组的指针,但这不适用于泛型.:-(

完整示例代码以演示此问题.第一个Alloc工作,但第二个失败了

对象包含非原始或非blittable数据.

    public struct X1
    {
        public double X;
    }

    public struct X2
    {
        public decimal X;
    }
Run Code Online (Sandbox Code Playgroud)

现在试试这个:

        var x1 = new[] {new X1 {X = 42}};
        var handle1 = GCHandle.Alloc(x1, GCHandleType.Pinned); // Works
        var x2 = new[] { new X2 { X = 42 } };
        var handle2 = GCHandle.Alloc(x2, GCHandleType.Pinned); // Fails
Run Code Online (Sandbox Code Playgroud)

.net c# memory-management

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

等待信号量可能仍在同一线程上执行代码

考虑附加到 Windows 窗体上的按钮的以下演示代码:

private void button1_Click(object sender, System.EventArgs e)
{
    var semaphore = new SemaphoreSlim(0, 1);

    Invalidate();  // <-- posts a message that surprisingly will be processed while we're waiting
    Paint += onPaint;
    semaphore.Wait(1000);
    Paint -= onPaint;

    void onPaint(object s, PaintEventArgs pe)
    {
        throw new System.NotImplementedException();  // we WILL hit this!
    }
}
Run Code Online (Sandbox Code Playgroud)

尽管我们挂在 UI 线程上的信号量等待上,但是Invalidate()当我们挂在Wait()UI 线程上的- AND(当然)上时,仍然会执行由 发布的绘制消息。

说明了我试图为其创建失败的单元测试的错误的根本原因 - 不使用任何 Windows 窗体。我已经使用 custom SyncronizationContexts 和TaskSchedulers玩了几个小时,但我无法在同一线程上实现这一点。

我想用伪代码做的是:

[Test] …
Run Code Online (Sandbox Code Playgroud)

c# multithreading semaphore winforms synchronizationcontext

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

避免处理底层流

我正在尝试模拟一些文件操作.在我的"真实"对象中:

StreamWriter createFile( string name )
{
  return new StreamWriter( Path.Combine( _outFolder, name ), false, Encoding.UTF8 ) );
}
Run Code Online (Sandbox Code Playgroud)

在模拟对象我有:

StreamWriter createFile( string name )
{
  var ms = new MemoryStream();
  _files.Add( Path.Combine( _outFolder, name ), ms );
  return new StreamWriter( ms, Encoding.UTF8 ) );
}
Run Code Online (Sandbox Code Playgroud)

其中_files是一个字典,用于存储创建的文件以供以后检查.

但是,当消费者关闭StreamWriter时,它还会处理MeamoryStream ...... :-(

有关如何追求这个的任何想法?

.net file mocking

4
推荐指数
1
解决办法
1757
查看次数

是否可以引用两个名称相同的命名空间?

标题应该说明一切......

编辑:显然标题并没有说明这一切,但Jon Skeet无论如何能够弄明白我的意思!

.net c#

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