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上是问题
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
并不是天生的邪恶或坏,它只是被那些不正确使用它的人诽谤。它只是相当于一个CGetMessage
/DispatchMessage
调用,如果您知道它的作用以及为什么要使用它,那么这就没有问题了。只是为了“我在尝试同步应用程序中的线程”而调用它,这会导致麻烦。DoEvent()的使用是从一个在线示例中复制的-这可能是我的第一个错误。我不得不为手机推出自己的“向导”用户界面。我将尝试在没有它的情况下重新构建。如果您已经使用Win32一年了,您将如何实现DoEvent循环所要达到的效果?您是否会在循环中调用GetMessage
和DispatchMessage
(这就是您在这里所做的)?我猜你不会的。试着从Win32体验的角度来看它。好的,谢谢。我从网上复制了一些(坏的)代码。。。我的第一个错误。