界面与线程 问题

   界面A,接收用户输入

   线程B,有任意多个,由A创建。B有一个状态标志,A通过设置B的状态标签来控制线程B。B实时将执行结果返回给A。

    该怎么设计?

    我现在的设计的是烂的。

  class A extends wxFrame

   {

            DispCtrl dispCtrl; // 显示控件

            createThread()   {   ThreadB *b = new ThreadB(); b->start();     // 创建线程

            ThreadCtrl()         // 控制线程B

            { 

                     b =  findThreadById(id);

                      b.setStatus( status );      // 比如暂停,取消,中止等等

         }

}

class ThreadB

{

    ThreadB( DispCtrl dispCtrl ){  this._dispCtrl  = dispCtrl ;  }// 将显示控件传入线程内部

     void run()

    {

         //  执行计算

          // 在这里实时更新界面显示dispCtrl 的数据

   }

}

界面API是wxWidgets

有相当一部分数据访问需要保证其是线程安全的,采用 wxCriticalSection/wxCriticalSectionLocker 来进行互斥访问,采用 wxMutexGuiEnter/wxMutexGuiLeave 在线程中更新界面显示。

但很奇怪。经常会发生莫名其妙的问题,一个不小心CPU就爆满了,再或者跳出错误。当更新数据去掉wxMutexGuiEnter/wxMutexGuiLeave,错误反而都消失了。

搞不清楚。头都晕了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在C#中,可以通过多线程来实现界面的同时显示。具体实现步骤如下: 1. 创建一个新的线程来执行耗时操作,例如读取大量数据或者执行复杂的计算。可以使用Thread类来创建线程。 2. 在执行耗时操作的线程中,通过委托来更新界面上的控件。例如,可以使用Invoke方法来调用主线程中的方法,从而更新界面上的控件。 3. 在主线程中,需要定义一个委托,用于更新界面上的控件。这个委托需要和界面上的控件的类型和方法的签名一致。 4. 在界面上的控件的事件中,启动新线程来执行耗时操作。 下面是一个简单的例子,演示了如何在C#中使用多线程来更新界面上的控件: ```csharp using System; using System.Threading; using System.Windows.Forms; namespace MultiThreadDemo { public partial class MainForm : Form { private delegate void UpdateTextBoxDelegate(string text); public MainForm() { InitializeComponent(); } private void btnStart_Click(object sender, EventArgs e) { // 创建新线程来执行耗时操作 Thread thread = new Thread(new ThreadStart(DoWork)); thread.Start(); } private void DoWork() { // 模拟耗时操作 for (int i = 0; i < 10; i++) { Thread.Sleep(1000); // 更新文本框的内容 string text = string.Format("当前时间:{0}", DateTime.Now.ToString()); UpdateTextBox(text); } } private void UpdateTextBox(string text) { // 如果调用线程不是创建控件的线程,则使用Invoke方法来调用控件的方法 if (txtOutput.InvokeRequired) { UpdateTextBoxDelegate delegateObj = new UpdateTextBoxDelegate(UpdateTextBox); txtOutput.Invoke(delegateObj, text); } else { // 直接更新文本框的内容 txtOutput.Text = text; } } } } ``` 在这个例子中,当用户点击“开始”按钮时,会创建一个新线程来执行DoWork方法。在DoWork方法中,会模拟一个耗时操作,并且通过UpdateTextBox方法来更新界面上的文本框。 UpdateTextBox方法中,首先判断调用线程是否是创建控件的线程。如果不是,则通过Invoke方法来调用控件的方法;如果是,则直接更新控件的内容。这样就可以在多线程的情况下安全地更新界面上的控件。 需要注意的是,由于多线程会增加程序的复杂度,因此在使用多线程时需要格外小心,避免出现线程安全问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值