在C#中线程化TabControl

在C#中线程化TabControl,第1张

概述这是一个有点奇怪的设置,我正在计划重做它,但是,如果没有别的,我希望我可以学习更多关于线程的结果. 目前,我有一个我正在构建的应用程序,它使用TabControl Windows窗体作为其设计的基础.我有很多不同的事情需要做,所以我认为这可能是最好的方法. 现在,我正在将Macro函数编码到程序中,以便用户可以记录和回放鼠标和键盘 *** 作.这非常好,并将它与System.Timers.Timer混合也 这是一个有点奇怪的设置,我正在计划重做它,但是,如果没有别的,我希望我可以学习更多关于线程的结果.

目前,我有一个我正在构建的应用程序,它使用TabControl Windows窗体作为其设计的基础.我有很多不同的事情需要做,所以我认为这可能是最好的方法.

现在,我正在将Macro函数编码到程序中,以便用户可以记录和回放鼠标和键盘 *** 作.这非常好,并将它与System.Timers.Timer混合也一直没问题.但是,我正在使用的DLL使用Thread.Sleep(x)在击键和鼠标执行之间暂停线程.

此时,该按钮位于不同的标签页上,并切换到其他页面.但是,空白点设置导致程序在等待宏执行完成时挂起.

为了更好地解释一下:

>用户单击主tabcontrol中的按钮.
> Tabcontrol.Selectedindex切换到正确的页面,但不刷新页面(我试过调用this.Refresh(),它没有工作)
>宏执行
> Tabcontrol完成加载页面,但到此时,必要的宏已经执行,加载的页面是多余的.

为了解决这个问题,我开始研究线程并了解如何使用它.我在一个类中提出了以下代码:

Class X{  Thread othread;  ...          public voID Play()  {    if ((othread != null) && !(othread.IsAlive))    {        othread = new Thread(playValues);        GC.Collect();    }    else if (othread == null) othread = new Thread(playValues);    else return;    othread.Start();  }  public voID PlayValues(){  ...  Thread.CurrentThread.Abort();  }}

线程被销毁的原因是,每次用户点击主窗体中的“播放”时,都会调用X.Play(),所以我需要重用线程(我研究过Monitor.pulse(),但是给了我异步调用错误),或者每次完成时永久销毁它.

现在,目前,代码工作正常.但是,每次我必须播放一个宏时,我一直在创建和销毁线程这一事实略显令人担忧,而且大量的GC调用也让我感到担忧.

我是否可以获得有关线程的一些指示,以及如何在没有此设置的情况下更好地完成此 *** 作?事实上,辅助选项卡是一个网页,宏在网页的表单上执行.

>编辑:我不知道如果我没有说清楚,但宏是使用鼠标和键盘模拟器.另一个选项卡是一个webbrowser设置,它将一个applet嵌入其中,所以我正在模拟硬件功能以执行自动设置.这有帮助,因为我不需要锁定任何东西(所有鼠标和键盘调用都由模拟器 *** 作,并且不受第三级选项卡控制的值的影响),我只需要能够a)让线程执行用户按下按钮时功能相同,b)移除一些多余的材料.

我还被告知’Thread.CurrentThread.Abort’是线程安全的,因此如果你想永久地结束它,这是结束线程的好方法,但如果我可以让线程重复其功能而不是杀死它,那就是精彩…

解决方法 要重用播放线程,可以使用主线程中Set()的autoresetEvent.线程空闲时也是如此 – 主线程准备播放所需的数据,然后Set()是一个不同的autoresetEvent,导致播放线程启动.

因此,下面示例中的startPlayingautoresetEvent导致线程等待,直到主线程告诉它“go”,而stopPlayingautoresetEvent导致播放线程响应主线程,告诉它在没有执行步骤时“停止”.

主线程:

// prepare data to playstartPlayingautoresetEvent.Set();// ...stopPlayingautoresetEvent.Set();

玩线程:

while (true){    // wait for the main thread to signal "start"    startPlayingautoresetEvent.WaitOne();    // ensure the stopPlaying is in an unsignalled state    stopPlayingautoresetEvent.reset();    // gather the data the main thread has prepared    while (stepstoplay)    {        // wait until main thread signals to stop OR timeout has elapsed        if (stopPlayingautoresetEvent.WaitOne(timeout))        {            // abort current run and put thread in IDle mode,waiting for new commands            break;        }        else        {            // play next step        }    }}
总结

以上是内存溢出为你收集整理的在C#中线程化TabControl全部内容,希望文章能够帮你解决在C#中线程化TabControl所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1228935.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存