我正在编写一个应用程序,要求我采用专有的位图格式(MVTec Halcon HImage)并将其转换为C#中的System.Drawing.Bitmap.
给我的唯一专有功能是帮助我这样做,这涉及到我写入文件,除了使用"获取指针"功能.
这个功能很棒,它给了我一个指向像素数据,宽度,高度和图像类型的指针.
我的问题是,当我使用构造函数创建System.Drawing.Bitmap时:
new System.Drawing.Bitmap(width, height, stride, format, scan)
我需要指定一个4的倍数的"步幅".这可能是一个问题,因为我不确定我的函数将被命中的大小位图.假设我最终得到一个111x111像素的位图,除了在我的图像中添加一个伪列或减去3列之外,我无法运行此功能.
有没有办法可以绕过这个限制?
我相信我遇到了与在我的C#2008 WinForms应用程序中使用带有WebBrowser控件的embed标签相关的安全问题.
这是我的代码:
private void button2_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate("C:/page1.html");
}
private void button1_Click(object sender, EventArgs e)
{
    webBrowser1.Navigate("about:blank");
    Thread.Sleep(1000);
    webBrowser1.Document.Write("<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>");
}
这是page1.html的内容:
<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>
Button1生成单词"Hello".Button2生成单词"Hello",其下方嵌入了一个电影播放器.
当我查看两个页面的源时,我注意到它们是相同的,除了源文件的名称.
这让我相信它与我的IE安全设置有关,但我注意到我为嵌入式内容设置了完整的权限.也许控件不能正确识别页面的来源,因此不允许使用嵌入标签.
我怎样才能以编程方式克服这个问题?我想避免将我的页面写入文件,并不惜一切代价导航到该文件.有关如何欺骗浏览器控件正常工作的任何建议?
第一编辑:
根据这篇文章Webbrowser Navigate Embedded Resource这将有效,但是我(JT)尝试了它并没有:
System.IO.Stream stream = this.GetType().Assembly.GetManifestResourceStream("WindowsFormsApplication1.Properties.test.html");
webBrowser1.DocumentStream = stream;
再现问题时的奇怪行为:
webBrowser1.Navigate("about:blank");
do
{
Thread.Sleep(100);
} while (webBrowser1.IsBusy == true);
//Method 1. Doesn't work
string htmlString1 = File.ReadAllText("C:/page1.html");
webBrowser1.Document.Write(htmlString1);
//Method 2. Doesn't work
string htmlString2 = "<html><body><p>Hello</p><embed src='C:/test.wmv' /></body></html>";
webBrowser1.Document.Write(htmlString2);
//Method 3. DOES …我有一个其他有效的问题这里关于这可能涉及LOH碎片可能还有其他未知因素中的一些绝望的内存问题.
我现在的问题是,接受的做事方式是什么?如果我的应用程序需要在Visual C#来完成,并且需要处理大型阵列的INT [4000000]调,我怎么能不被垃圾收集器拒绝处理LOH注定?
似乎我被迫将任何大型数组全局化,并且从不在它们周围使用"new"这个词.所以,我留下了带有"maxindex"变量的不合适的全局数组,而不是由函数传递的整齐大小的数组.
我总是被告知这是不好的做法.还有什么选择?
是否有某种功能System.GC.CollectLOH("Seriously")?是否有可能将垃圾收集外包给System.GC以外的其他方式?
无论如何,处理大型(> 85Kb)变量的普遍接受的规则是什么?
好吧,我再次提出另一个令人沮丧的问题.我需要结束我的主进程并重新启动它,但我不能只是优雅地结束应用程序...
我正在将C#应用程序与专有(不是我)数据捕获硬件结合使用,因此它已经很复杂了.
有一种情况,我的软件正在愉快地运行,收集它应该的数据,当我与之接口的硬件突然断电和与我的应用程序的连接时.我的应用程序最终解决了这个问题,我只需要处理我的旧连接,然后重新连接到我的硬件.错误...
当然,我的对象(带有硬件的接口对象)上的.Dispose()方法终止连接什么都不做,实际上当我尝试运行它时,它就永远锁定到位.显然,在断开发生时,需要设备连接的配置方法永远不会超时.我没有写这个方法,所以我真的不知道.
最后,这是我的问题.让我的应用程序重新启动并再次运行的唯一方法是关闭它并重新打开它.当然,我实际上无法很好地关闭它因为我无法运行Dispose方法.我被迫通过任务管理器结束它的过程.是的,这个过程,而不仅仅是应用程序.如果我关闭它,这个过程将永远存在,我别无选择.
我需要找到一种方法来自动化这个过程暗杀,这样我的用户才能真正使用它,但我该怎么办?我知道流程终止是禁忌,但我有什么选择?
我喜欢使用Application.Restart(),但这根本不起作用,我的表格甚至没有关闭,它只是锁定.有没有办法在告诉自己重新启动之前解决这个过程?也许我可以使用批处理文件或其他东西吗?Application.Exit至少将表单从屏幕上移除.
截至目前,我正在从任务管理器中删除它,或者我的用户通过弹出PC上的断路器来杀死它.比任何软件方面都要严厉得多.
我的问题可能并不是真正的实时处理,但可能也是如此.
我的应用程序有几个线程比GUI重要得多,但我确实希望GUI至少可用.我不希望它一直被锁定,我确实想要更新屏幕给出我正在执行的处理结果.
目前我所有必需的项目都是在单独的线程中隔离的,我调用GUI的代理来显示结果.
我的GUI工作正常,但如果我更改标签,或最小化/最大化它,已知会阻碍我的其他线程到他们无法在0.1秒的时间限制内执行操作的程度.
这就是我打电话给我的代表所做的事情:
delegate void FuncDelegate(ResultContainer Result);
FuncDelegate DelegatedDisplay= new FuncDelegate(DisplayResults);
//then later on
Invoke(DelegatedDisplay, Result);
我的大多数关键进程都是在连续循环中运行的线程,从各种缓冲区(ArrayLists和普通列表)拉出并推送到各种缓冲区.
每次都会启动我的一个关键线程,使用:
Thread mythread = new Thread(new ThreadStart(ProcessResults));
mythread.Start();
我之所以这样做,而不是仅仅让一个线程在一个循环中运行,从列表中拉出来,是因为我认为我的时钟时间耗尽的原因是我有一个我担心消耗太多的轮询循环资源(虽然每次轮询结果为负时我都使用Thread.Sleep(5)).
每次我需要并发进程时启动一个新线程会花费我宝贵的时间吗?这应该是一个循环吗?我的循环是否应该受到责备?
我可以给一个线程比其他线程更高的优先级,还是使用Thread.Sleep我唯一的选择?如果我确定分配更高的线程优先级,我怎么能确定其他线程可以存活?
为什么简单的表单事件会妨碍我的其他线程呢?有没有办法为我的GUI线程分配更少量的资源?如果其他线程的时钟时间不足,我可以使用Thread.Sleep以某种方式阻止Form事件吗?
如果没有我所有令人沮丧的问题的答案,是否有某种线程分析器我可以用来帮助解决我的问题?我尝试使用"托管堆栈资源管理器"但不知何故并不总是显示我的应用程序有什么线程.
对此事的任何帮助都会对我有所帮助.
我对正确的线程相对绿色,我有这个,它是为了简单而修改但它基本上是相同的东西:
//Global:
N=2
bool[] mySwitches;
//In my main:
mySwitches = new bool[N];
for (int i = 0; i < N; i++)
{
    ThreadList.Add(new Thread(() => Worker(i)));
    ThreadList[i].Start();
}
//Outside of main:
Private Void Worker(int num)
{
  while(true)
  {
    if (mySwitches[num]) //error happes here because num is equal to N, how?
    {
        //do something
    }
  }
}
如上所示,工作线程以某种方式得到num = N的值,我希望它只能达到N-1.我知道在创建Worker之后我会增加,是不是以某种方式通过引用而不是值传递?
我尝试通过在while循环之前进行测试来修复问题,如果num = N则返回,但即使使用此规定,我也会得到相同的错误.这让我相信在线程启动后,num会以某种方式递增.
我通过在ThreadList [i] .Start()之后直接放置Sleep(20)来解决这个问题,但我真的不喜欢使用Sleep,很明显我不知道这个线程场景是如何工作的.
任何人都可以对此有所了解吗?
我正在使用Visual C#Express 2008,我有一个在表单上启动的应用程序,但使用具有委托显示功能的线程来处理基本上所有的处理.这样,我的表单在处理任务时不会锁定.
半最近,经过多次重复过程(程序处理传入的数据,所以当数据进入时,过程重复)我的应用程序将崩溃,出现System.OutOfMemory错误.
错误消息中的堆栈跟踪是无用的,因为它只将我引导到我调用委托表单控件功能的行.
我听说有人说他们使用SysInternals的ProcMon来查看为什么会出现这样的错误.但是,对于我的生活,我无法弄明白.我正在使用的内存量不会随着程序的运行而改变,如果程序运行起来,它会恢复原状.另外,即使它上升了,我怎么知道我的程序的哪个部分是问题?
我怎样才能调查这个问题?
编辑:
因此,在深入研究这个问题之后,我浏览了一些我曾经重新宣布过的事情.有几个例子我有hugematrix = new uint [gigantic],所以我摆脱了其中的3个.
它没有摆脱错误,而是更加模糊和混乱.
我的应用程序获取传入的数据,并使用OpenGL呈现它.现在,它不会抛出"System.OutOfMemory"而只是不使用OpenGL渲染任何东西.
我的代码唯一的区别是我没有为保存我绘制的数据制作新的矩阵.这样,我希望,我的阵列在记忆中保持相同的位置,并且对我的LOH没有任何自杀行为.
不幸的是,这使得野兽远远超出了我的微薄手段.弹出零错误,我的所有数据结构显然仍然正常填充,我怎么能找到我的问题?OpenGL是否以晦涩的方式使用内存,以便在失败时不抛出异常?记忆还有问题吗?我怎么知道的?世界上所有的内存分析器似乎都很少告诉我.
编辑:
随着来自这个社区的大量支持(对Amissico的额外赞誉),错误终于被根除了.显然我是在OpenGL列表中添加项目,并且从不将它们从列表中删除.
最终让我知道的应用程序是.Net Memory Profiler.在崩溃时,它显示了该<unknown>类别中的1.5GB数据.通过消除过程(列表中所有其他名称),从列表中检查的最后一件事是OpenGL渲染pipleline.其余的都是历史.
我认为枚举是静态的,有什么意义const enum呢?
例如:
const typedef enum
{
    NORMAL_FUN = 1,
    GREAT_FUN = 2,
    TERRIBLE_FUN = 3,
} Annoying;
我有一个旧的程序,我被迫与之合作(来自设备制造商),并且我一直在讨论定义的枚举const typedef enum.
现在,我习惯了C#,所以我并不完全理解所有正在进行的C++技巧,但这种情况似乎很简单.
从程序的编码看,似乎所有类型的变量Annoying都要随时随地改变.
它们并不意味着不变.长话短说,编译器不喜欢它.
这个样本是在2010年之前的某个时候写回来的,所以这可能是某种版本的差异,但是const typedef enum甚至意味着什么?