我在尝试调试/修复应用程序时非常困难。
简言之: - 我创建了一个“向导”类型的应用程序,从用户拍照开始(使用照片的常用对话框)
如果用户在拍摄照片后尝试使用文本输入窗口(SIP)(小键盘输入窗口),则事件循环似乎挂起 - 事件未处理或延迟一段时间。
如果用户没有拍照,那么SIP键盘效果很好。
这只发生在我的某些设备上。特别是它在MC65上不是问题,但在ES400上是个问题。
应用程序的事件循环似乎搞砸了我显示表单和拍照的方式。
如果创建了一个简单的测试应用程序,其中单个表单包含一个按钮(事件处理程序拍摄照片)和一个接受输入的文本框。这很好。但它只是一个单一的表单应用程序,没有别的。
当我将照片拍摄与我的表格显示(制作“向导”)结合起来时,情况会很糟糕。
我想知道我应该运行什么样的事件循环?
基本上用户拍摄照片然后浏览一些表格(我隐藏一个表单并在他们点击“下一步”按钮时显示另一个表单。)
在拍摄照片后,从主窗体调用Form.Show然后我有类似的东西:
while(UserNotFinished)
{
Application.DoEvents()
}
其中UserNotFinished
是在按下“提交”按钮后从我的向导/表单设置的标志。
我很乐意提供更多代码,但不确定哪些内容有用。
我是C#和CF开发的新手(很多年的C ++ / Win32)
真正令人困惑的部分是,它可以在一台设备上运行,但不能在另一台设备上运行。事实上,该设备完全挂起。它结束了activesync连接,有时我必须通过取出电池进行硬重置。
答案 0 :(得分:1)
我认为你的问题源于while(true){DoEvents();也许你是如何尝试在表格之间进行的。我使用DoEvents()方法的唯一一次是当我已经在Windows事件的范围内时,我需要确保处理消息队列中的某些内容,以便屏幕更新正确。我建议创建一个控制器类来管理向导的屏幕流程。您可以通过使用ShowDialog()来控制屏幕流,并直接在单个调用的范围内执行流控制,或者您必须使用Show()和异步机制,例如订阅和处理特定的表单和控件控制器类中的事件。还看到了关于引入另一个线程的注释,请注意Forms属于它们创建的线程,并且您必须在创建线程的上下文中调用(...)所有Form成员。
答案 1 :(得分:0)
嗯。很奇怪
我开始了一个新线程,基本上也调用了Application.DoEvents(),它似乎解决了这个问题......
我不知道为什么
而(真) { 的DoEvents() }
主线程中的不起作用。