前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# 线程中操作窗体控件

C# 线程中操作窗体控件

作者头像
zls365
发布于 2020-08-19 03:03:34
发布于 2020-08-19 03:03:34
1.2K00
代码可运行
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全
运行总次数:0
代码可运行

1. 在线程中给textBox1

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApp12
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

           // CheckForIllegalCrossThreadCalls = false;
           // Class1 cs1 = new Class1();
            Thread th = new Thread(test1);
            th.Start();
            // cs1.ShowEvent = test;

        }

        public void test1()
        {

           // ShowlbDevTem("123");
            textBox1.Text = "123";

        }


        private void button1_Click(object sender, EventArgs e)
        {

           // ShowlbDevTem("112");

        }

        /*   public void test(string str)
          {

              ShowlbDevTem(str);
          }
          
          public delegate void SWTDelegate(string AddStr);
           //public delegate void ComsumerTextDelegate(int Index, string AddStr);
           public  void ShowlbDevTem(string AddStr)
           {
               if (textBox1.InvokeRequired)
               {
                   SWTDelegate pd = new SWTDelegate(ShowlbDevTem);
                   textBox1.Invoke(pd, new object[] { AddStr });
               }
               else
               {
                   textBox1.Text = AddStr;
                   //richTextBox1.AppendText(AddStr);
               }
           }

           public void dataShow(int row, int column, string str)
           {
               row = row % 30;
               ShowMessage(dataGridViewX1, str, row, column);

           }


          delegate void ShowMessageDelegate(DataGridView dg, string message, int row, int column);
          private void ShowMessage(DataGridView dg, string message, int row, int column)
          {
              if (dg.InvokeRequired)
              {
                  ShowMessageDelegate showMessageDelegate = ShowMessage;
                  dg.Invoke(showMessageDelegate, new object[] { dg, message, row, column });
              }
              else
              {

                  dg.Rows[row].Cells[column].Value = message;
              }
          }
          */


    }
}

运行结果:

线程中是不允许直接操作窗体空间的

怎么解决呢?

方法1: CheckForIllegalCrossThreadCalls = false;

运行ok

方法2:委托实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApp12
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

           //CheckForIllegalCrossThreadCalls = false;
           // Class1 cs1 = new Class1();
            Thread th = new Thread(test1);
            th.Start();
            // cs1.ShowEvent = test;

        }

        public void test1()
        {

            ShowlbDevTem("123");
            //textBox1.Text = "123";

        }


        private void button1_Click(object sender, EventArgs e)
        {

           // ShowlbDevTem("112");

        }

        /*  public void test(string str)
          {

              ShowlbDevTem(str);
          }*/
          
          public delegate void SWTDelegate(string AddStr);
           //public delegate void ComsumerTextDelegate(int Index, string AddStr);
           public  void ShowlbDevTem(string AddStr)
           {
               if (textBox1.InvokeRequired)
               {
                   SWTDelegate pd = new SWTDelegate(ShowlbDevTem);
                   textBox1.Invoke(pd, new object[] { AddStr });
               }
               else
               {
                   textBox1.Text = AddStr;
                   //richTextBox1.AppendText(AddStr);
               }
           }

         /*  public void dataShow(int row, int column, string str)
           {
               row = row % 30;
               ShowMessage(dataGridViewX1, str, row, column);

           }


          delegate void ShowMessageDelegate(DataGridView dg, string message, int row, int column);
          private void ShowMessage(DataGridView dg, string message, int row, int column)
          {
              if (dg.InvokeRequired)
              {
                  ShowMessageDelegate showMessageDelegate = ShowMessage;
                  dg.Invoke(showMessageDelegate, new object[] { dg, message, row, column });
              }
              else
              {

                  dg.Rows[row].Cells[column].Value = message;
              }
          }
          */


    }
}

然后我想在类中对空间进行操作,这样还可以么?

试试看

主窗体代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApp12
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

           //CheckForIllegalCrossThreadCalls = false;
            Class1 cs1 = new Class1();
            Thread th = new Thread(cs1.test);
            th.Start();
            // cs1.ShowEvent = test;

        }

        public void test1()
        {

            ShowlbDevTem("123");
            //textBox1.Text = "123";

        }


        private void button1_Click(object sender, EventArgs e)
        {

           // ShowlbDevTem("112");

        }

        /*  public void test(string str)
          {

              ShowlbDevTem(str);
          }*/
          
          public delegate void SWTDelegate(string AddStr);
           //public delegate void ComsumerTextDelegate(int Index, string AddStr);
           public  void ShowlbDevTem(string AddStr)
           {
               if (textBox1.InvokeRequired)
               {
                   SWTDelegate pd = new SWTDelegate(ShowlbDevTem);
                   textBox1.Invoke(pd, new object[] { AddStr });
               }
               else
               {
                   textBox1.Text = AddStr;
                   //richTextBox1.AppendText(AddStr);
               }
           }

         /*  public void dataShow(int row, int column, string str)
           {
               row = row % 30;
               ShowMessage(dataGridViewX1, str, row, column);

           }


          delegate void ShowMessageDelegate(DataGridView dg, string message, int row, int column);
          private void ShowMessage(DataGridView dg, string message, int row, int column)
          {
              if (dg.InvokeRequired)
              {
                  ShowMessageDelegate showMessageDelegate = ShowMessage;
                  dg.Invoke(showMessageDelegate, new object[] { dg, message, row, column });
              }
              else
              {

                  dg.Rows[row].Cells[column].Value = message;
              }
          }
          */


    }
}

class1中代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp12
{
    class Class1
    {
        //public Action<string> ShowEvent;
        public void test()
        {

           //ShowEvent("123456789");

            Form1 f1 = new Form1();
            f1.ShowlbDevTem("112");


        }
        

        
    }
}

运行结果:

哎呦,卧槽

运行不报错 但是文本框中是空的,怎么办?

主窗体:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;

namespace WindowsFormsApp12
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

           //CheckForIllegalCrossThreadCalls = false;
            Class1 cs1 = new Class1();
            Thread th = new Thread(cs1.test);
            th.Start();
             cs1.ShowEvent = test;

        }

        public void test1()
        {

            ShowlbDevTem("123");
            //textBox1.Text = "123";

        }


        private void button1_Click(object sender, EventArgs e)
        {

           // ShowlbDevTem("112");

        }

         public void test(string str)
          {

              ShowlbDevTem(str);
          }
          
          public delegate void SWTDelegate(string AddStr);
           //public delegate void ComsumerTextDelegate(int Index, string AddStr);
           public  void ShowlbDevTem(string AddStr)
           {
               if (textBox1.InvokeRequired)
               {
                   SWTDelegate pd = new SWTDelegate(ShowlbDevTem);
                   textBox1.Invoke(pd, new object[] { AddStr });
               }
               else
               {
                   textBox1.Text = AddStr;
                   //richTextBox1.AppendText(AddStr);
               }
           }

         /*  public void dataShow(int row, int column, string str)
           {
               row = row % 30;
               ShowMessage(dataGridViewX1, str, row, column);

           }


          delegate void ShowMessageDelegate(DataGridView dg, string message, int row, int column);
          private void ShowMessage(DataGridView dg, string message, int row, int column)
          {
              if (dg.InvokeRequired)
              {
                  ShowMessageDelegate showMessageDelegate = ShowMessage;
                  dg.Invoke(showMessageDelegate, new object[] { dg, message, row, column });
              }
              else
              {

                  dg.Rows[row].Cells[column].Value = message;
              }
          }
          */


    }
}

类中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp12
{
    class Class1
    {
        public Action<string> ShowEvent;
        public void test()
        {

           ShowEvent("123456789");

           // Form1 f1 = new Form1();
            //f1.ShowlbDevTem("112");


        }
        

        
    }
}

总算可以了

但是我有两个类,线程在class1,委托在class2回调呢?

主窗体代码不变

class1代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;
using System.Windows.Forms;

namespace WindowsFormsApp12
{
    class Class1
    {
        public Action<string> ShowEvent;
        public void test()
        {


            // Class2 cs2 = new Class2();
            // cs2.test(ShowEvent);
            Class2 cs2 = new Class2();
           cs2.test(ShowEvent);

        }




    }
}

class2代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;

namespace WindowsFormsApp12
{
    class Class2
    {
       // public Action<string> ShowEvent1;
        public void test(Action<string> ShowEvent)
        {


            ShowEvent("123456789");

        }
      
    }
}

完!!!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
c语言之 malloc函数详解「建议收藏」
一、原型:extern void *malloc(unsigned int num_bytes);
全栈程序员站长
2022/09/07
1.4K0
C语言之malloc函数「建议收藏」
malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。
全栈程序员站长
2022/09/01
8980
C语言进阶(十二) - 动态内存管理
void* malloc(size_t size); 头文件<stdlib.h>
怠惰的未禾
2023/04/27
5960
C语言进阶(十二) - 动态内存管理
C语言实例_实现malloc与free函数完成内存管理
malloc函数用于在堆(heap)中分配指定大小的内存空间,并返回一个指向该内存块的指针。
DS小龙哥
2023/08/24
6220
C语言实例_实现malloc与free函数完成内存管理
C语言万字基础笔记总结(三)
- 例:编写一个函数sum,由用户输入**参数n**,计算1+2+...+(n-1)+n的**结果并返回**。
远方的星
2021/08/02
9730
C语言万字基础笔记总结(三)
[C语言]动态内存管理与柔性数组
1. 栈区( stack ):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结
IT编程爱好者
2023/04/12
3640
[C语言]动态内存管理与柔性数组
C语言动态内存管理超详解
但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间大小在程序运行的时候才能知道,那数组的编译时开辟空间的方式就不能满足了。 C语言引入了动态内存开辟,让程序员自己可以申请和释放空间,就比较灵活了。
fhvyxyci
2024/09/24
2270
C语言动态内存管理超详解
C语言——动态内存分配
从名字上来看,动态内存分配就是可以动态调整内存空间,那么我们为什么要进行动态内存开辟呢?
用户11352420
2024/11/07
1940
C语言——动态内存分配
c语言指针的有关总结
像我们可以写程序来操纵计算机内存这样子。 或者我们可以这样认为,物理内存是可以看得见,摸得着的,而虚拟内存反之。有关对虚拟内存的更深的认识点击这里虚拟内存
兰舟千帆
2022/07/17
3850
c语言指针的有关总结
C语言从入门到实战——动态内存管理
在C语言中,动态内存管理是指程序运行时,通过调用特定的函数动态地分配和释放内存空间。动态内存管理允许程序在运行时根据实际需要来分配内存,避免了静态内存分配在编译时就确定固定大小的限制。
鲜于言悠
2024/03/20
3380
C语言从入门到实战——动态内存管理
回溯1:动态内存管理与C语言实践
在C语言中,内存管理是一个非常重要的部分,尤其是动态内存管理。程序在运行时所需的内存大小往往是未知的,因此无法依赖编译时的静态内存分配。在这种情况下,动态内存管理成为程序员处理复杂数据结构时的有力工具。本篇文章将详细讲解C语言中的动态内存管理原理、常用函数及其典型应用,并通过相关代码示例来论证。
用户11289931
2024/11/24
3420
【C语言】自学终极笔记
函数包括:函数首部(第一行)+函数体(‘{’+内容+‘}‘),函数体=函数声明(即函数原型)+执行部分。
SarPro
2024/02/20
1860
【C语言】自学终极笔记
malloc函数具体解释
一、原型:extern void *malloc(unsigned int num_bytes);
全栈程序员站长
2022/07/13
6180
C 语言中的 malloc,free,calloc,realloc
malloc函数 原型:extern void* malloc(unsigned int size); 功能:动态分配内存; 注意:size 仅仅为申请内存字节大小,与申请内存块中存储的数据类型无关,故编程时需要通过以下方式给出:长度 * sizeof(数据类型); 示例: //动态分配内存,输入5个数据,并把低于60的值打印出来 #include <stdio.h> #include <stdlib.h> int main() { int *ptr = (int *)ma
村雨遥
2022/06/15
4830
【C语言】动态内存的管理
1. 栈区(stack):在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内
用户11290673
2024/09/25
1170
【C语言】动态内存的管理
C语言基础总结
我学习的第一门编程语言是Java,所以之前一直没有系统学习过C语言。这篇文章主要就是我学习过程的一个总结,方便以后复习查看。
害恶细君
2024/09/16
2210
C语言基础总结
【C语言】动态内存管理大总结
有了动态内存的开辟,那我们自然就要有回收和释放,C语言提供了另外一个函数free,专门是用来做动态内存的释放和回收的,函数原型如下 :
平凡的人1
2022/11/15
4370
【C语言】动态内存管理大总结
C语言——动态内存管理
但是上述的开辟空间的方式有两个特点: 1. 空间开辟大小是固定的。 2. 数组在申明的时候,必须指定数组的长度,它所需要的内存在编译时分配。
小李很执着
2024/06/15
1220
C语言——动态内存管理
C语言 | C++动态分配与静态分配的区别
所谓动态内存分配就是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法。动态内存分配不象数组等静态内存分配方法那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且分配的大小就是程序要求的大小。
小林C语言
2020/12/27
3.3K0
C语言 | C++动态分配与静态分配的区别
C语言入门系列之10.结构体和共用体
引入: 有时需要将不同类型的数据组合成一个有机的整体,以便于引用。 例如,一个学生有学号、姓名、性别、年龄、地址等属性,需要定义int num; char name[20]; char sex; int age; int char addr[30];等属性,如下:
cutercorley
2020/07/23
1.3K0
C语言入门系列之10.结构体和共用体
相关推荐
c语言之 malloc函数详解「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档