Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么这个WinMobile(Compact Framework)应用程序在拍照后挂起?_C#_Windows Mobile_Compact Framework_Freeze_Windows Mobile 6.5 - Fatal编程技术网

C# 为什么这个WinMobile(Compact Framework)应用程序在拍照后挂起?

C# 为什么这个WinMobile(Compact Framework)应用程序在拍照后挂起?,c#,windows-mobile,compact-framework,freeze,windows-mobile-6.5,C#,Windows Mobile,Compact Framework,Freeze,Windows Mobile 6.5,我很难调试/修复应用程序 简而言之: -我创建了一个“向导”类型的应用程序,从用户拍照开始(使用照片的通用对话框) 如果用户在拍照后尝试使用文本输入窗口(SIP)(小键盘输入窗口),则事件循环似乎挂起-事件未被处理或延迟一段时间 如果用户不拍照,SIP键盘工作得很好 这只发生在我的一些设备上。具体来说,这在MC65上不是问题,但在ES400上是问题 应用程序的事件循环似乎被我显示表单和拍照的方式搞砸了 如果创建了一个简单的测试应用程序,它有一个表单,其中包含一个按钮(事件处理程序拍摄照片)和

我很难调试/修复应用程序

简而言之: -我创建了一个“向导”类型的应用程序,从用户拍照开始(使用照片的通用对话框)

  • 如果用户在拍照后尝试使用文本输入窗口(SIP)(小键盘输入窗口),则事件循环似乎挂起-事件未被处理或延迟一段时间

  • 如果用户不拍照,SIP键盘工作得很好

  • 这只发生在我的一些设备上。具体来说,这在MC65上不是问题,但在ES400上是问题

应用程序的事件循环似乎被我显示表单和拍照的方式搞砸了

如果创建了一个简单的测试应用程序,它有一个表单,其中包含一个按钮(事件处理程序拍摄照片)和一个接受输入的文本框。那很好。但它只是一个单一的表单应用程序,没有其他功能

当我把拍照和我的表单显示结合起来(制作一个“向导”)时,事情就糟了

我想知道我应该运行哪种类型的事件循环

基本上,用户先拍照,然后浏览一些表单(当他们单击“下一步”按钮时,我会隐藏一个表单并显示另一个表单)

在拍摄照片后,从主窗体调用Form.Show,然后我有如下内容:

while(UserNotFinished)
{
   Application.DoEvents()
}
其中,
UserNotFinished
是在按下“提交”按钮后从my wizard/forms设置的标志

我很乐意提供更多的代码,但不确定什么是有用的

我不熟悉C#和CF开发(多年的C++/Win32)

真正令人困惑的是,这在一台设备上有效,但在另一台设备上无效。事实上,设备完全挂起。它结束了activesync连接,有时我必须通过卸下电池来硬复位

嗯,很奇怪

我启动了一个新线程,基本上也调用了Application.DoEvents(),它似乎解决了这个问题

我不知道为什么会这样

while(true) { DoEvents() }


在主线程中不起作用。

我认为您的问题源于while(true){DoEvents();}以及您如何尝试在表单之间切换。我唯一一次使用DoEvents()方法是当我已经在windows事件的作用域中时,我需要确保消息队列中的某些内容已被处理,以便屏幕更新是正确的。我建议创建一个控制器类来管理向导的屏幕流。您可以通过使用ShowDialog()并在单个调用的范围内直接执行流控制来控制屏幕流,或者必须使用Show()和异步机制,例如订阅和处理控制器类中的特定表单和控制事件。还看到了关于引入另一个线程的评论,请注意表单属于创建它们的线程,并且必须在创建线程的上下文中调用(…)所有表单成员

主线程中的DoEvents()不起作用,因为挂起的是主线程。否则,应用程序将能够自己执行DoEvents()。我想看看你的事件处理程序,它可以用处理照片之类的东西挂起你的主线程。哦,据我所知,调用DoEvents()被认为是邪恶的。是的,DoEvents()是不好的。这是VB程序员留下的糟糕编程实践。它基本上是说,“我不知道该做什么或我在做什么。”多年来,我一直认为,
DoEvents
并不是天生的邪恶或坏,它只是被那些不正确使用它的人诽谤。它只是相当于一个C
GetMessage
/
DispatchMessage
调用,如果您知道它的作用以及为什么要使用它,那么这就没有问题了。只是为了“我在尝试同步应用程序中的线程”而调用它,这会导致麻烦。DoEvent()的使用是从一个在线示例中复制的-这可能是我的第一个错误。我不得不为手机推出自己的“向导”用户界面。我将尝试在没有它的情况下重新构建。如果您已经使用Win32一年了,您将如何实现DoEvent循环所要达到的效果?您是否会在循环中调用
GetMessage
DispatchMessage
(这就是您在这里所做的)?我猜你不会的。试着从Win32体验的角度来看它。好的,谢谢。我从网上复制了一些(坏的)代码。。。我的第一个错误。