一个是就是比如我在一个线程中判断对方发来的消息来做事,比如对方返回OK我就开启一个新的窗口,主窗口就隐藏了,就是想问下 为什么子窗口一出来就卡住了界面看不到 我知道肯定是这个窗口是在线程中打开的所以窗口要卡住,我就是想问有什么方法让子窗口启动的时候不卡住
如果我在主程序中调用就不卡,有不有好的解决办法;
二的个:就是关于线程调用控键的问题, 一个线程调用不是自己线程的控键的时候他要包错,
我们可以用falseco什么的一个静态函数设置为false就可以避免了 但我发现这个办法对treeview控键不行,还有中方法就是调用Control.Invu()什么的方法来委托调用 就是这个方法我不会请大家交我下谢谢
6 个解决方案
#1
private static int size = 1024;
private static string clientReceiveStr = null;
private static byte[] clientReceiveBytes = new byte[size];
public delegate void getTXT();
private void Form1_Load(object sender, EventArgs e)
{
…………………… //各种连接就不写了
……………………
Thread td = new Thread(XX); //如果不开启线程,Receive()等待接收而不执行下去,就会出现你说的窗口卡住的现象
}
public void XX()
{
try
{
while (true)
{
int n = ClientSocket.Receive(clientReceiveBytes, clientReceiveBytes.Length, 0);
clientReceiveStr = Encoding.UTF8.GetString(clientReceiveBytes, 0, n);
getTXT get = new getTXT(HH); //要给textbox1赋值,因为在不同线程,所以要调用委托
}
}
catch
{
}
}
public void HH()
{
textBox1.Text = clientReceiveStr;
}
#2
public delegate void FileHandler(Zhzhu.Model.MessageInfo arg);
this.BeginInvoke(new FileHandler(SaveFile), message);//显示保存文件窗体(Control.BeginInvoke())
private void SaveFile(Zhzhu.Model.MessageInfo message)
{
FileForm file = new FileForm();
file.Tag = message;
file.FileSocket = client_UdpSocket;
file.Show();
}
#3
没这说法吧。。。
可能有两个原因:
1、你是在监听线程下实例化窗体,举例,我循环监听,当获得数据包后还要回到监听状态,因为个时候没有数据包,线程就挂在这里了,你生成窗体的代码运行被延迟;
2、你隐藏主线程的窗体,用到委托,这块可能没有处理好,举例,我委托窗体隐藏,但是主线程正在运行别的东西,子线程等待返回值。
#4
看了第二条问题,才知道,你压根没有用委托,你看看这方面资料吧。。。。
两个问题用委托都可以完美解决
#5
哈哈,看楼上的表情很有意思。。。。
1.楼主在调用子窗体的时候不要再FromLode的时候做监听等操作,可以异步起新线程监听
2.C#认定在线程中操作控件是不安全的行为,禁止操作的,所以要用到委托代理,网上例子很多,看看吧。
1.楼主在调用子窗体的时候不要再FromLode的时候做监听等操作,可以异步起新线程监听
2.C#认定在线程中操作控件是不安全的行为,禁止操作的,所以要用到委托代理,网上例子很多,看看吧。
#6
看见lz的结贴率就沉默了
#1
private static int size = 1024;
private static string clientReceiveStr = null;
private static byte[] clientReceiveBytes = new byte[size];
public delegate void getTXT();
private void Form1_Load(object sender, EventArgs e)
{
…………………… //各种连接就不写了
……………………
Thread td = new Thread(XX); //如果不开启线程,Receive()等待接收而不执行下去,就会出现你说的窗口卡住的现象
}
public void XX()
{
try
{
while (true)
{
int n = ClientSocket.Receive(clientReceiveBytes, clientReceiveBytes.Length, 0);
clientReceiveStr = Encoding.UTF8.GetString(clientReceiveBytes, 0, n);
getTXT get = new getTXT(HH); //要给textbox1赋值,因为在不同线程,所以要调用委托
}
}
catch
{
}
}
public void HH()
{
textBox1.Text = clientReceiveStr;
}
#2
public delegate void FileHandler(Zhzhu.Model.MessageInfo arg);
this.BeginInvoke(new FileHandler(SaveFile), message);//显示保存文件窗体(Control.BeginInvoke())
private void SaveFile(Zhzhu.Model.MessageInfo message)
{
FileForm file = new FileForm();
file.Tag = message;
file.FileSocket = client_UdpSocket;
file.Show();
}
#3
没这说法吧。。。
可能有两个原因:
1、你是在监听线程下实例化窗体,举例,我循环监听,当获得数据包后还要回到监听状态,因为个时候没有数据包,线程就挂在这里了,你生成窗体的代码运行被延迟;
2、你隐藏主线程的窗体,用到委托,这块可能没有处理好,举例,我委托窗体隐藏,但是主线程正在运行别的东西,子线程等待返回值。
#4
看了第二条问题,才知道,你压根没有用委托,你看看这方面资料吧。。。。
两个问题用委托都可以完美解决
#5
哈哈,看楼上的表情很有意思。。。。
1.楼主在调用子窗体的时候不要再FromLode的时候做监听等操作,可以异步起新线程监听
2.C#认定在线程中操作控件是不安全的行为,禁止操作的,所以要用到委托代理,网上例子很多,看看吧。
1.楼主在调用子窗体的时候不要再FromLode的时候做监听等操作,可以异步起新线程监听
2.C#认定在线程中操作控件是不安全的行为,禁止操作的,所以要用到委托代理,网上例子很多,看看吧。
#6
看见lz的结贴率就沉默了