首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

[]C#中多线程中窗体的操作

2012-09-15 
[求助]C#中多线程中窗体的操作项目中遇到一个问题,一直没解决,球牛人[codeC#][/code]帮助。在主窗口线程创

[求助]C#中多线程中窗体的操作
项目中遇到一个问题,一直没解决,球牛人[code=C#][/code]帮助。
在主窗口线程创建一窗口,并把其隐藏,然都的等待消息,在另外线程中把该窗口显示出,这怎样实现啊,有做过这方面的给点指点,告诉我从那方向下手查资料也行,我都查了一天了。。。
首先在窗体中重新定义了show和hide方法

C# code
 public void ThreadShow()        {            if (this.InvokeRequired)            {                MethodInvoker invoker = new MethodInvoker(this.Show);                this.Invoke(invoker, null);            }            else            {                this.Show();            }        }        public void ThreadHide()        {            if (this.InvokeRequired)            {                MethodInvoker invoker = new MethodInvoker(this.Hide);                this.Invoke(invoker, null);            }            else            {                this.Hide();            }        }

在主线程中创建该窗体
C# code
private void FormMain_Load(object sender, EventArgs e){            fingerIm = new FingerIm();            fingerIm.ThreadShow();            fingerIm.ThreadHide();}在另一线程中显示该窗体

 
C# code
fingerIm.ThreadShow();

但是程序运行的结果并不对,但不调试窗口出现了,但是一片白,窗口上的空间没有显示

[解决办法]
windows form就只有一个UI线程,所以你看main方法的入口都有STAThread的attribute
控制UI线程,其它的工作线程是做不到的,这个时候就需要begininvoke方法

其实就是个异步委托,等待UI线程在空闲的时候在响应就可以了

不知道楼主的this是什么,不过可以改成begininvoke试验下
[解决办法]
那this 就是那个窗口的正在运行的实例了, 可以用begininvoke方法替换掉invoke试验下
[解决办法]
C# code
namespace Show{    partial class Form1    {        /// <summary>        /// 必需的设计器变量。        /// </summary>        private System.ComponentModel.IContainer components = null;        /// <summary>        /// 清理所有正在使用的资源。        /// </summary>        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>        protected override void Dispose(bool disposing)        {            if (disposing && (components != null))            {                components.Dispose();            }            base.Dispose(disposing);        }        #region Windows 窗体设计器生成的代码        /// <summary>        /// 设计器支持所需的方法 - 不要        /// 使用代码编辑器修改此方法的内容。        /// </summary>        private void InitializeComponent()        {            this.button1 = new System.Windows.Forms.Button();            this.SuspendLayout();            //             // button1            //             this.button1.Location = new System.Drawing.Point(96, 92);            this.button1.Name = "button1";            this.button1.Size = new System.Drawing.Size(75, 23);            this.button1.TabIndex = 0;            this.button1.Text = "线程开始";            this.button1.UseVisualStyleBackColor = true;            this.button1.Click += new System.EventHandler(this.button1_Click);            //             // Form1            //             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;            this.ClientSize = new System.Drawing.Size(292, 266);            this.Controls.Add(this.button1);            this.Name = "Form1";            this.Text = "Form1";            this.ResumeLayout(false);        }        #endregion        private System.Windows.Forms.Button button1;    }}using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;namespace Show{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            new Thread(delegate() { ShowMsg(); }).Start();        }        public void ShowMsg()        {            if (InvokeRequired)            {                BeginInvoke(new Action(ShowMsg));            }            else            {                MessageBox.Show("线程调用");            }        }    }} 

热点排行