多线程窗体,如何访问?

pfworld 2010-01-04 04:22:20
现实现窗体内通过panel显示新窗体,由于显示窗体较多(6个),每个窗体有的访问数据库,有的显示FLash,有的访问硬件,因此想通过多线程解决,显示多线程实现了,但是无法简易访问个窗体属性,方法,控件?寻求解决方法?




private Thread thread01;

////定义一个委托,用于打开窗体
public delegate void ShowCallback();

//线程方法
private void OpenForm01()
{
if (this.InvokeRequired)
{
ShowCallback d = new ShowCallback(OpenForm01);
this.Invoke(d, new object[] { });
}
else
{
FrmAddCarNo frmAddCarNo = new FrmAddCarNo();
frmAddCarNo.TopLevel = false;
frmAddCarNo.Visible = true;
//添加
this.panelCarNo.Controls.Add(frmAddCarNo as Control);
}
}

//启动线程
private void StartThread01()
{
thread01 = new Thread(new ThreadStart(OpenForm01));
//thread01.IsBackground = true;
thread01.Start();
}
...全文
318 34 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangjiang113 2010-01-26
  • 打赏
  • 举报
回复
public Form1()
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;
}
再不行就用
this.Invoke(new ThreadStart(up));
wangzi_112 2010-01-26
  • 打赏
  • 举报
回复
帮顶
foxwfb 2010-01-14
  • 打赏
  • 举报
回复
委托
pfworld 2010-01-14
  • 打赏
  • 举报
回复
up!
Lucky_6Q 2010-01-10
  • 打赏
  • 举报
回复
路过,学习了!
pfworld 2010-01-10
  • 打赏
  • 举报
回复
up!
ouyangliping 2010-01-05
  • 打赏
  • 举报
回复
没太看懂,继续学习
pfworld 2010-01-05
  • 打赏
  • 举报
回复
private FrmAddCarNo frmaddCarNo;
private void btn_Print_Click(object sender, EventArgs e)
{
try
{
frmaddCarNo = (FrmAddCarNo)this.panelCarNo.Controls[0];

this.lbl_View02.Text = frmaddCarNo.GetCarNo();
}
catch
{
throw;
}
finally
{
frmaddCarNo = null;
GC.Collect();
}

}
wartim 2010-01-05
  • 打赏
  • 举报
回复
没有隐患,this.Invoke,就是在this(form)的这个主线程上执行同步委托,所建的一切都是在主线程上的
lsd123 2010-01-04
  • 打赏
  • 举报
回复
.
flyerwing 2010-01-04
  • 打赏
  • 举报
回复
invoke
pfworld 2010-01-04
  • 打赏
  • 举报
回复
private void btn_Print_Click(object sender, EventArgs e)
{
FrmAddCarNo frmaddCarNo = (FrmAddCarNo)this.panelCarNo.Controls[0];

this.lbl_View02.Text = frmaddCarNo.GetCarNo();
}

这样写有什么隐患?
pfworld 2010-01-04
  • 打赏
  • 举报
回复
FrmAddCarNo frmaddCarNo = (FrmAddCarNo)this.panelCarNo.Controls[0];

就可以直接修改了!!晕!!这个不会不在线程吧?
wartim 2010-01-04
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsApplication257
{
public partial class Form1 : Form
{
Panel panelCarNo = new Panel();
bool Created = false;

public Form1()
{
InitializeComponent();

panelCarNo.Parent = this;
panelCarNo.Dock = DockStyle.Fill;

this.Shown += new EventHandler(Form1_Shown);
}

void Form1_Shown(object sender, EventArgs e)
{
new Thread(new ThreadStart(OpenFormThread)).Start();

while (!Created)
Application.DoEvents();

Form F = (Form)this.panelCarNo.Controls.Find("XXX", true)[0];
F.Text = "ZZZZZZZZ";
}

delegate void ShowCallback();

void OpenFormThread()
{
this.Invoke(new ShowCallback(Do));
Created = true;
}

void Do()
{
Form frmAddCarNo = new Form();
frmAddCarNo.TopLevel = false;
frmAddCarNo.Visible = true;
frmAddCarNo.Parent = this.panelCarNo;
frmAddCarNo.Name = "XXX";
}
}
}
满衣兄 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 pfworld 的回复:]
引用 11 楼 yfqvip 的回复:
引用 8 楼 pfworld 的回复:
对于线程还是不是太熟,问一下?

FrmAddCarNo frmAddCarNo = new FrmAddCarNo();



FrmAddCarNo frmAddCarNo;

frmAddCarNo = new FrmAddCarNo();

区别在那里?


例如:我把FrmAddCarNo frmAddCarNo定义在主窗体,frmAddCarNo = new FrmAddCarNo();实例化在线程内,那么frmAddCarNo到底属于主线程还是新建线程呢?


FrmAddCarNo frmAddCarNo = new FrmAddCarNo();// 声明变量并分配内存



FrmAddCarNo frmAddCarNo;// 声明变量不分配内存
frmAddCarNo = new FrmAddCarNo();// 分配内存
=============================================
frmAddCarNo到底属于主线程还是新建线程呢?严格来讲不能这么问,如果非要这么问是属于主线程的,C#是线程安全的,所以要在线程之外访问控件也必须保证线程安全,但是在线程之外访问控件是被看做非线程安全的,所以这里用代理访问。例子已经给你了,先看下吧。



问题是,我声明的是FrmAddCarNo frmAddCarNo窗体,如何取值呀?晕得很,还是不太明白!


[/Quote]
把参数加上ref 或者out就行了
pfworld 2010-01-04
  • 打赏
  • 举报
回复
这个我获取值了,但是我想实现点中主窗体的Button实时获取当前子窗体(线程内)的值,每次获取的都是委托第一次运行的值!!晕!
wartim 2010-01-04
  • 打赏
  • 举报
回复
你不是自己都写了么,委托
l171147904 2010-01-04
  • 打赏
  • 举报
回复
...........
pfworld 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yfqvip 的回复:]
引用 8 楼 pfworld 的回复:
对于线程还是不是太熟,问一下?

FrmAddCarNo frmAddCarNo = new FrmAddCarNo();



FrmAddCarNo frmAddCarNo;

frmAddCarNo = new FrmAddCarNo();

区别在那里?


例如:我把FrmAddCarNo frmAddCarNo定义在主窗体,frmAddCarNo = new FrmAddCarNo();实例化在线程内,那么frmAddCarNo到底属于主线程还是新建线程呢?



FrmAddCarNo frmAddCarNo = new FrmAddCarNo();// 声明变量并分配内存



FrmAddCarNo frmAddCarNo;// 声明变量不分配内存
frmAddCarNo = new FrmAddCarNo();// 分配内存
=============================================
frmAddCarNo到底属于主线程还是新建线程呢?严格来讲不能这么问,如果非要这么问是属于主线程的,C#是线程安全的,所以要在线程之外访问控件也必须保证线程安全,但是在线程之外访问控件是被看做非线程安全的,所以这里用代理访问。例子已经给你了,先看下吧。
[/Quote]


问题是,我声明的是FrmAddCarNo frmAddCarNo窗体,如何取值呀?晕得很,还是不太明白!

加载更多回复(14)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧