日期:2014-05-19  浏览次数:20907 次

▲▲▲线程中怎么弹出窗体
程序启动后,有一个一直运行的后台线程,线程检测远程数据库中是否有更新,有则缓冲到本地,我想缓冲一次成功后就弹出一个提示窗口,如MSN一样,但在线程中却怎么也弹不出来,不放到线程就肯定没问题,各位如果谁做过,给点提示或代码,非常感谢。

------解决方案--------------------
线程不能直接修改其他窗体的控件,不知道是不是也不能显示窗体,我知道如何通过线程修改其他窗体控件的方法,你看看会不会对你有帮助,下面的代码是通过Delegate 回调函数修改窗体控件的代码,也许会有帮助,要回家了,今天不能帮你试试了,如果实在不行明天帮你看看,直接用邮件联系吧,tellyes_software@126.com
delegate void SetTextCallback(string text);
private static SetTextCallback d;

private void setLabelText(string text)
{
if (this.label1.InvokeRequired)
{
d = new SetTextCallback(setLabelText);
this.Invoke(d, new object[] { text });
}
else
{
this.label1.Text = text;
}
}
------解决方案--------------------
楼上说在线程里不可以直接修改主线程窗体中的控件,这种说法不完全正确的。
只要将窗体中的 CheckForIllegalCrossThreadCalls 属性设置为 false 就可以在其它线程中修改。
但是,在VS2005中,微软是不推荐使用这样的方式的,它在一定程度上使程序变得“不安全”。至于从其它线程访问窗体控件,楼上的用法是最好的。利用托管。
其实也可以利用事件,声明事件后,在线程中激活事件就可以了。
也许还有其它方法,我只知道这三种方法。哈哈。

可是LZ要问的似乎不是这个。
比如在线程中要打开想OpenFileDialog这样的窗口就不行,前几天做一个小东西的时候也遇到这样的问题,还没想到解决方法,大家知道的话发上来看一下。

------解决方案--------------------
写个委托,在线程里调用就可以了
------解决方案--------------------
前面打错了,第四行:
“其它线程访问窗体控件,楼上的用法是最好的。利用托管。”
应该是“利用委托”

------解决方案--------------------
不是很懂,帮顶一下
------解决方案--------------------
学习了...
------解决方案--------------------
using System;
using System.Collections.Generic;
using System.ComponentModel;

using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;


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

private void Form1_Load(object sender, EventArgs e)
{
this.MsgEvent += new MsgEventHandler(Form1_MsgEvent);
}

void Form1_MsgEvent(string msg)
{
ShowMsg s = new ShowMsg(ShowWindow);
this.Invoke(s, new object[] { msg });
}


private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(process));
th.Start();
}
private void process()
{
while (true)
{
MsgEvent( "test ");
break;
}
}

public delegate void MsgEventHandler(string msg);
public event MsgEventHandler MsgEvent;
delegate void ShowMsg(string msg);
private void ShowWindow(string msg)
{
Form2 f = new Form2();
f.Show();
}

}
}