【问题标题】:Exiting while loop in winapi在winapi中退出while循环
【发布时间】:2017-01-16 14:24:56
【问题描述】:

我的问题是这个。我有复选框,选中时会启动 while 循环。在那个while循环中有createprocess函数。虽然复选框被标记为已选中,但功能会一次又一次地自我重复。问题是,当循环运行时,我无法再次按下复选框来更改它的值并停止该过程。我认为这里需要两个并行进程同时工作,但我不确定。我的问题是: * 有没有办法在 while 循环运行时访问我的控件? * 或者我应该使用其他东西而不是 while 进程?

建议或某种示例将不胜感激。

【问题讨论】:

  • 请提供一个最小、完整、可验证的示例,以便我们帮助您正确解决您的问题:stackoverflow.com/help/mcve
  • 你不能在窗口过程中做任何循环。你需要基于事件的代码。所以不要循环 - 这是错误的。当复选框选中/取消选中时 - 你收到了通知 - 基于此通知并执行一些任务
  • 问题不是基于代码的,所以代码在这里并不重要。我只是在寻找选项或建议,@RbMm 给了我一些。
  • Window 过程中的任何循环或等待都是主要错误。任何消息都必须快速处理并返回控制权。

标签: winapi


【解决方案1】:

问题是您在拥有 CheckBox 的同一线程中运行循环,并且该循环阻止线程处理新消息。这就是为什么您无法取消选中 CheckBox(或对您的 UI 执行任何其他操作)。

您需要:

  1. 将循环移至工作线程。当 CheckBox 被选中时,启动线程。当 CheckBox 变为未选中状态时,停止线程。根本不要阻塞对话框的线程。这是最好的选择。

  2. 分解您的循环并使其成为事件驱动的。当 CheckBox 被选中时,向自己发布一条自定义窗口消息。当您收到该消息时,如果 CheckBox 仍处于选中状态,则执行循环的 one 迭代,然后再次将消息发回给自己。重复直到 CheckBox 变为未选中状态。此选项不需要任何线程,但您的 UI 在每次单独迭代期间仍将被阻止(但您将能够在两次迭代之间取消选中 CheckBox),除非...

  3. 保留现有的循环代码,但添加一个内部循环,在CreateProcess() 成功后调用MsgWaitForMultipleObjects(),直到衍生的进程退出。在等待期间,每当MsgWaitForMultipleObjects() 告诉您有新消息正在等待时,您都可以抽取消息队列并分派任何检索到的消息。这是最不理想的选择,但它需要对现有代码进行最少的更改。

【讨论】:

  • 谢谢@Remy Lebeau。通过创建一个线程,我实现了我想要的功能
猜你喜欢
  • 1970-01-01
  • 2013-05-15
  • 1970-01-01
  • 2010-11-19
  • 1970-01-01
  • 2013-03-01
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
相关资源
最近更新 更多