您好,你之前提的关于QThread暂停和继续运行的问题,请问最后是如何解决的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了您好,你之前提的关于QThread暂停和继续运行的问题,请问最后是如何解决的?相关的知识,希望对你有一定的参考价值。

我现在碰到的问题和你那会儿一样,就是wait子线程以后主线程界面卡死

当然卡死了。主线程不要wait。子线程结束后,通过singal通知主线程,这样在主线程的通知slot中去wait子线程(子线程已经结束,wait处理不会堵塞主线程的) 参考技术A 贴出代码。

如何在DispatcherTimer结束之前暂停for循环?

我希望for循环等到计时器结束,然后继续for循环。我该怎么做呢?我试着等待和异步,我做错了什么。它现在做什么:循环启动,运行计时器但不等待它完成。所以它循环开启,并再次启动计时器。

更多关于我的项目:它是一个电动床的电机测试仪。这段代码需要在电机上升或下降的时间运行。因此我使用MVVM,WPF,ADRUINO UNO。

如果有人有好的建议,我很乐意听到。 (对不起,我的英语不好)。

代码:

private async void Loop(object sender, EventArgs e)
    {
        for (int i = 0; i < DOORLOOPTEST.Properties.Settings.Default.LOOPS; i++)
        {
            string value = DOORLOOPTEST.Properties.Settings.Default.UP_or_DOWN;
            switch (value)
            {
                case "UP":
                    _time = TimeSpan.FromSeconds(HeadUpTime);
                    _MotorMove = new Task(() => MotorMove(sender, e, _time));
                    await _MotorMove;
                    break;

                case "DOWN":
                    _time = TimeSpan.FromSeconds(HeadDownTime);
                    _MotorMove = new Task(() => MotorMove(sender, e, _time));
                    await _MotorMove;
                    break;
            }
        }
    }

    private void MotorMove(object sender, EventArgs e, TimeSpan _time)
    {
        TimerBegins(sender, e);
        LOOP_timer = new DispatcherTimer(new TimeSpan(0, 0, 1), DispatcherPriority.Normal, delegate
        {
            if (_time == TimeSpan.Zero)
            {
                LOOP_timer.Stop();
                LOOP_timer.Tick += TimerIsGedaan;
            }
            _time = _time.Add(TimeSpan.FromSeconds(-1));
        }, Application.Current.Dispatcher);

        LOOP_timer.Start();
    }
答案

只是为了澄清评论:

除非代码比你的MVCE还多,看起来DispatcherTimer的唯一目的是引入TimeSpan _time的延迟,在1秒的量子中勾选,然后最后的滴答然后停止计时器,订阅TimerIsGedaan,然后启动再次计时?

假设你想要做的只是在TimerIsGedaan过去后调用TimeSpan _time,那么如何将MotorMove转换为异步,并使用Task.Delay

private async Task MotorMove(object sender, EventArgs e, TimeSpan _time)
{
    TimerBegins(sender, e);
    await Task.Delay(_time);
    TimerIsGedaan();
}

除非你每次都需要一个新的线程,你也可以考虑从你的Task.Run代码中删除Loop,即

 await MotorMove(sender, e, _time);

以上是关于您好,你之前提的关于QThread暂停和继续运行的问题,请问最后是如何解决的?的主要内容,如果未能解决你的问题,请参考以下文章

线程的停止和暂停

从 Worker 暂停/恢复 Qthread

在 qt 中使用 QThread 实现启动/停止/暂停

Qthread 调用只运行一次

用于编辑和继续的 Visual Studio 快捷键:暂停、(编译)然后再次运行

JAVA如何暂停运行,等网络恢复后再从上次的断点处继续运行程序?