这篇文章,部分代码是一个好友(高手)BoC2008告诉我的。。。

首先是个超简单的例子:

using System.Threading;

namespace ConsoleApplication1
{

class Program
    {
        public static Thread thread1 = new Thread(new ThreadStart(HelloWorld));//这里ThreadStart()好像必须要接static的方法
        static void Main(string[] args)
        {

Thread thread1 = new Thread(new ThreadStart(HelloWorld));
            Thread thread2 = new Thread(new ThreadStart(HellodotNet));
            thread1.Start();
            thread2.Start();

Console.Read();

}

protected static void HelloWorld()
        {

while (1 == 1)
            {
                Console.WriteLine("Hello World!");
                Thread.Sleep(1000);
            }
           
        }

protected static void HellodotNet()
        {

for (int i = 1; i < 3; i++)
            {
                Console.WriteLine("Hello dotNet!");
                Thread.Sleep(1000);
            }

}
    }
}

//----------------------------------------------------注解

//Thread thread = new Thread(new ThreadStart(HelloWorld));
            //thread.Start();//开始一个线程

//thread.Priority = ThreadPriority.Highest;

//if (thread.IsAlive)//判断线程状态
            //{
            //    Console.WriteLine("Thread is Alive");
            //    Console.WriteLine(thread.ThreadState.ToString());
            //}

//if (thread.ThreadState == ThreadState.Running)//挂起一个线程
            //{
            //    Thread.Sleep(1000);//暂停线程
            //    Console.WriteLine("Thread is Suspend");
            //    Console.WriteLine(thread.ThreadState.ToString());
            //}

//if (thread.ThreadState == ThreadState.Suspended)//唤醒一个线程
            //{
            //    thread.Resume();
            //    Console.WriteLine("Thread is Resume");
            //    Console.WriteLine(thread.ThreadState.ToString());
            //}

//thread.Abort();

//if (!thread.IsAlive)
            //{
            //    Console.WriteLine("Thread is Over");
            //}

//--------------------------------------------------------------------

下面才是我要得瑟的东西,虽然是朋友告诉我的,我也不太明白吧。。。但是我觉得很厉害

1:说明:我要写个线程每秒去触发读卡器工作,然后把读到的结果传给form窗体

2:代码:

线程类:

using System.Threading;
using System.Runtime.InteropServices//这个是用来引用dll的

namespace cmp
{
    public delegate void CardReadHandler(string param);//建了个委托

public class CardReader
    {
        [DllImport("rfdll32.dll", EntryPoint = "rf_card", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern int rf_card();//读卡
        [DllImport("rfdll32.dll", EntryPoint = "rf_rd_card", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
        public static extern int rf_rd_card(int a, int b, int Idata, int c, byte[] sData);

//-------------------------------------引用外部的dll中的方法

public Thread thread1 = new Thread(new ThreadStart(ReadKA));

private static string kaid = "";

private static CardReadHandler onCardRead;//委托

public event CardReadHandler CardRead//一个事件
        {
            add { onCardRead += new CardReadHandler(value); }
            remove { onCardRead -= new CardReadHandler(value); }
        }

//读卡
        protected static void ReadKA()
        {

while (1 == 1)
            {
                Thread.Sleep(2000);//线程2秒释放下内存
                int read = rf_card();//读卡的方法
                if (read == 0)//有卡
                {
                    byte[] by = new byte[40];
                    int rd_card = rf_rd_card(18, 0, 2, 16, by);
                    Encoding ed = Encoding.ASCII;
                    string data = ed.GetString(by);
                    if (data == "dddddddddddddddddddddddddddddddd/0/0/0/0/0/0/0/0")//空值
                    { }
                    else
                    {
                        if (kaid + "/0/0/0/0/0/0/0/0" == data)//如果是同一张卡
                        {
                            onCardRead("0");//给另一个线程传值

}
                        else
                        {
                            kaid = data.Substring(0,8);
                            onCardRead(kaid);
                        }
                    }

}//没卡
                else
                {

onCardRead("1");//没有卡
                }

}

}
    }
}

3:在form窗体里:

namespace cmp
{
    public partial class gjcmp : Form
    {
        private static string ka_id = "";//学生id
        //private static string yemian = "";//判断是那个页面
        public gjcmp()
        {
            InitializeComponent();

//线程
            CardReader cd = new CardReader();
            cd.CardRead += this.OnCardRead;//这两行要写上去调上面线程的事件
        }

//线程返回的卡id
        private void OnCardRead(string param)//上面写的线程会不断给这个方法传值,所以操作写在这里
        {
                ka_id = param;
                object[] pList = { this, System.EventArgs.Empty };
                label1.BeginInvoke(new System.EventHandler(UpdateUI), pList);//这两行是还切换线程的,这样就可以给当前线程的控件传值了

}

//切换线程
        private void UpdateUI(object o, System.EventArgs e)
        {
                                label1.Text = ka_id;
        }

}

}

到这后台线程给主线程发消息就完成了。

本人也是初学,如有疏漏请指教。

4:最后补充句:from窗体获得页面值的方法:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)//跳转页面
        {
            System.Windows.Forms.HtmlDocument documnet = this.webBrowser1.Document;
            yemian = documnet.All["Text1"].GetAttribute("value");
        }

c#线程-线程间发消息-线程给窗体传值相关推荐

  1. Handler详解系列(四)——利用Handler在主线程与子线程之间互发消息,handler详解...

    MainActivity如下: package cc.c;import android.app.Activity; import android.os.Bundle; import android.o ...

  2. wxpython多线程 假死_wxpython多线程防假死与线程间传递消息实例详解

    wxpython中启用线程的方法,将GUI和功能的执行分开. 网上关于python多线程防假死与线程传递消息是几年前的,这里由于wxpython和threading模块已经更新最新,因此给出最新修改代 ...

  3. VC++中多线程学习(MFC多线程)二(线程的相关操作、线程间的通信)

    上一篇笼统介绍了如何创建线程以及线程如何和类成员函数通信,本篇将主要介绍: 线程的相关操作 1.线程的挂起和恢复:SuspendThread.ResumeThread 在线程创建并运行后,用户可以对线 ...

  4. android异步线程利用Handler将消息发送至UI线程

    android UI线程安全 首先对于android而言,UI线程就是我们的主线程,在Android应用启动时,会自动创建一个线程,主线程负责UI的展示.UI事件消息的派发处理等等,因此主线程也叫做U ...

  5. 不恰当使用线程池处理 MQ 消息引起的故障

    现状 业务部门反应网站访问特别慢,负责运维监控的同事说MQ消息队列积压了,中间件的说应用服务器内存占用很高,GC 一直回收不了内存,GC 线程占了近 100% 的 CPU,其他的基本上都在等待,数据库 ...

  6. IOT-OS之RT-Thread(六)--- 线程间同步与线程间通信

    文章目录 一.IPC对象管理 1.1 IPC对象控制块 1.2 IPC对象接口函数 二.线程间同步对象管理 2.1 信号量对象管理 2.2 互斥量对象管理 2.3 事件集对象管理 三.线程间通信对象管 ...

  7. 线程间通信方式Linux,线程间的通信、同步方式与进程间通信方式

    1.线程间的通信方式 使用全局变量 主要由于多个线程可能更改全局变量,因此全局变量最好声明为volatile 使用消息实现通信 在Windows程序设计中,每一个线程都可以拥有自己的消息队列(UI线程 ...

  8. C++ 使用_beginthreadex创建线程、线程句柄(等待线程关闭)、线程id的作用(发送线程消息)

    _beginthreadex c语言库 process.h 中的函数, 用来创建一个线程 unsigned long _beginthreadex(       void *security,     ...

  9. linux的进程与线程通信方式,Linux的进程/线程间通信方式总结

    Linux系统中的进程间通信方式主要以下几种: 同一主机上的进程通信方式 * UNIX进程间通信方式: 包括管道(PIPE), 有名管道(FIFO), 和信号(Signal) * System V进程 ...

最新文章

  1. 遥控车_vijos1458_纪中1724_水
  2. UILabel显示带颜色边的文字
  3. Android之实现RTL的ViewPager
  4. AI端部署“三问”:模型如何跑起来、跑得快、持续跑
  5. python哪些系统可以运行_python可以检测它在哪个操作系统下运行吗?
  6. 将一个数转化为二进制java_java将一个整数转化成二进制代码示例
  7. 速读-对抗攻击的弹性异构DNN加速器体系结构
  8. 牛牛游戏牛型判断算法实现
  9. C语言字母an,易错题之大一C语言英语
  10. 职高c语言,C语言职高班教学计划
  11. 【数据结构】稀疏数组
  12. 电脑连不上ishanghai_ishanghai用电脑肿么连网
  13. JS打开模态窗口showModalDialog
  14. JetBrains全家桶软件
  15. 软件定义的网络--改头换面的改造?
  16. 关闭 php X-Powered-By 信息
  17. JavaFX专业开发者与业余开发者之间就差一个一个Icon packs
  18. Excel 基础常用函数(一)
  19. 数据恢复软件EasyRecovery帮你解决设备受限的烦恼
  20. 可以清理掉重复文件的PC软件

热门文章

  1. 莫纳什大学计算机专业排名,2020年莫纳什大学排名前五的专业有哪些
  2. 这些专业配音软件你值得拥有
  3. Unity--Particle system(粒子系统)(一)
  4. 重装操作系统流程心得
  5. 解决MERCURY弹出上网公告的窗口方法
  6. 合并多个文件的内容到一个文件
  7. 多媒体开发之---开源库ffmeg的log之子解析
  8. 如何将doc格式转换成jpg图片格式
  9. FME将用SHP数据对栅格影像数据进行裁剪
  10. 最全遥感样本数据集分享:场景识别数据集