为什么这张WinMobile(Compact Framework)应用程序在拍完照片后会挂起?

时间:2011-10-17 22:12:31

标签: c# windows-mobile compact-framework hang windows-mobile-6.5

我在尝试调试/修复应用程序时非常困难。

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

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

  • 如果用户没有拍照,那么SIP键盘效果很好。

  • 这只发生在我的某些设备上。特别是它在MC65上不是问题,但在ES400上是个问题。

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

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

当我将照片拍摄与我的表格显示(制作“向导”)结合起来时,情况会很糟糕。

我想知道我应该运行什么样的事件循环?

基本上用户拍摄照片然后浏览一些表格(我隐藏一个表单并在他们点击“下一步”按钮时显示另一个表单。)

在拍摄照片后,从主窗体调用Form.Show然后我有类似的东西:

while(UserNotFinished)
{
   Application.DoEvents()
}

其中UserNotFinished是在按下“提交”按钮后从我的向导/表单设置的标志。

我很乐意提供更多代码,但不确定哪些内容有用。

我是C#和CF开发的新手(很多年的C ++ / Win32)

真正令人困惑的部分是,它可以在一台设备上运行,但不能在另一台设备上运行。事实上,该设备完全挂起。它结束了activesync连接,有时我必须通过取出电池进行硬重置。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

嗯。很奇怪

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

我不知道为什么

而(真) { 的DoEvents() }

主线程中的

不起作用。