请问下,怎么样实现一个线程来调用控制多个线程的执行

时间:2022-09-29 11:24:57
在C# Winfrom项目中,有一个主窗体(mainfrom)和三个子窗体(subfrom1、subfrom2、subfrom3).
在主窗体(mainfrom)中有一个进程(用来控制调用三个子窗体中的进程)。在三个子窗体中分别各有一个进程(用于控制执行各自子窗体中的任务)。

请问怎么样实现在主窗体中的进程来控制调用三个子窗体中进程的执行,可以动态控制调用这三个子窗体中的进程的执行。
有没有相关的DEMO或参考资料,谢谢。

9 个解决方案

#1


到底是进程还是线程?
试试Mutex?

#2


当然是线程了

#3


能不能再具体点,谢谢

#4


你这个问法我当你已经会一个线程的用法,那么。。一个线程控制三个。。。这个问题好象有点问题,如果你要在主窗体分别控制三个子窗体中的线程,你可以写三个方法(或一个方法传不同参数)来调用
比如:
BaseForm:T1()
Form1:BaseForm  T1(){}
Form2:BaseForm  T1(){}
Form3:BaseForm  T1(){}
MainForm:
void CallT(BaseForm f)
{
    f.T1();
}

private void button1_Click(...)
{
    Form1 f=new Form1();
    CallT(f);
}

private void button2_Click(...)
{
    Form2 f=new Form2();
    CallT(f);
}

private void button3_Click(...)
{
    Form3 f=new Form3();
    CallT(f);
}

#5


不同的需求要使用不同的同步方式,没有具体的需求,那就给一个通用的线程教程: http://www.albahari.com/threading/part2.aspx。总的来说,一个是保护共享资源不被多个线程同时修改,另一个是控制线程的阻塞和继续。一般就是lock和xxxResetEvent(Slim)用的比较多。也可看下 http://bbs.csdn.net/topics/390978972#post-398844623是之前类似的问题。

#6


线程在启动只后“一瞬间”就结束了。有事情可干,可能启动50个线程也不算多。没有事情可干的事情,你启动3个线程在那里“循环、阻塞”也是没有意义的。

#7


窗体之间的通讯,通过窗体的属性、方法、事件来通讯,也就是通过窗体对象之间的正常关系来通讯。比如说A窗口调用了B窗口的a方法,或者B窗口触发的c事件可以被A窗口监听并处理,等等。

跟什么线程没有什么直接关系。线程是具体干什么事儿的时候才需要考虑的,例如需要把1+2+3的结果给计算出来,可是计算1+2只后需要把中间结果推送到电灯泡上去“闪三下”,然后再计算3+3,这时候就可以在子线程中控制电灯泡,而不用阻塞主线程计算3+3的动作。这个“控制电灯泡”的动作可能需要5ms,也可能需要250ms,总之不会阻塞计算,而且做完了该做的事情就自动结束了(实际上应该从系统线程中来分配线程,因此所谓“线程结束”的含义就是在执行完“点电灯泡”的用户定义方法只后,.net会自动将线程归还到系统线程池中)。

不要没事也编出什么“一个线程控制3个线程”来。需要并发调用某几个方法,就可以使用线程。方法在一瞬间执行完,线程也就结束了。

#8


就你的需求来说,根本就用不着多线程。用一个状态变量在不同窗体间共享就可以了。

#9


进程如同公司,线程如同员工,主线程就好比领导

领导负责对外交涉拉业务(UI),和管理员工(启动线程)

而不需要专门派一个员工去死盯着另外3个员工,那是闲的

#1


到底是进程还是线程?
试试Mutex?

#2


当然是线程了

#3


能不能再具体点,谢谢

#4


你这个问法我当你已经会一个线程的用法,那么。。一个线程控制三个。。。这个问题好象有点问题,如果你要在主窗体分别控制三个子窗体中的线程,你可以写三个方法(或一个方法传不同参数)来调用
比如:
BaseForm:T1()
Form1:BaseForm  T1(){}
Form2:BaseForm  T1(){}
Form3:BaseForm  T1(){}
MainForm:
void CallT(BaseForm f)
{
    f.T1();
}

private void button1_Click(...)
{
    Form1 f=new Form1();
    CallT(f);
}

private void button2_Click(...)
{
    Form2 f=new Form2();
    CallT(f);
}

private void button3_Click(...)
{
    Form3 f=new Form3();
    CallT(f);
}

#5


不同的需求要使用不同的同步方式,没有具体的需求,那就给一个通用的线程教程: http://www.albahari.com/threading/part2.aspx。总的来说,一个是保护共享资源不被多个线程同时修改,另一个是控制线程的阻塞和继续。一般就是lock和xxxResetEvent(Slim)用的比较多。也可看下 http://bbs.csdn.net/topics/390978972#post-398844623是之前类似的问题。

#6


线程在启动只后“一瞬间”就结束了。有事情可干,可能启动50个线程也不算多。没有事情可干的事情,你启动3个线程在那里“循环、阻塞”也是没有意义的。

#7


窗体之间的通讯,通过窗体的属性、方法、事件来通讯,也就是通过窗体对象之间的正常关系来通讯。比如说A窗口调用了B窗口的a方法,或者B窗口触发的c事件可以被A窗口监听并处理,等等。

跟什么线程没有什么直接关系。线程是具体干什么事儿的时候才需要考虑的,例如需要把1+2+3的结果给计算出来,可是计算1+2只后需要把中间结果推送到电灯泡上去“闪三下”,然后再计算3+3,这时候就可以在子线程中控制电灯泡,而不用阻塞主线程计算3+3的动作。这个“控制电灯泡”的动作可能需要5ms,也可能需要250ms,总之不会阻塞计算,而且做完了该做的事情就自动结束了(实际上应该从系统线程中来分配线程,因此所谓“线程结束”的含义就是在执行完“点电灯泡”的用户定义方法只后,.net会自动将线程归还到系统线程池中)。

不要没事也编出什么“一个线程控制3个线程”来。需要并发调用某几个方法,就可以使用线程。方法在一瞬间执行完,线程也就结束了。

#8


就你的需求来说,根本就用不着多线程。用一个状态变量在不同窗体间共享就可以了。

#9


进程如同公司,线程如同员工,主线程就好比领导

领导负责对外交涉拉业务(UI),和管理员工(启动线程)

而不需要专门派一个员工去死盯着另外3个员工,那是闲的