一个客户端程序的监听线程监听服务器端发来的命令,有的命令带图片,有的不带.
不带图片的命令,作动作都没关系,
问题是:带图片的命令如直接用监听线程去显示图片,则界面会处于死机状态,主界面无法输入.
如另开一个线程来做带图片的命令,则图片在线程结束时就没有了.
我该怎么办?
是什么原因造成的?
为什么用监听线程去显示图片,界面会处于死机状态,而如果没有显示图片,则没有关系.一切正常.
为什么用另一个新线程显示图片,图片在线程结束时就没有了.而且再有命令传来时,图片再也不显示了?
14 个解决方案
#1
看现象,应该是你显示图像的时候出错了,造成程序执行出错
#2
首先不能在另一個線程訪問界面,要用控件invoke方法。
最好你帖出代碼來??
最好你帖出代碼來??
#3
楼上说得相当的正确。要用Invoke方法。我记得微软的MSDN(中文)中有相关的论述。
#4
不好意思,看错了。原来图片能显示出来。
那说明显示图片的程序应该没错,线程就没了,应该是变量定义域的问题,你的一些变量是不是在线程中定义的,这样线程结束的时候这些变量就失效了。
另外,下次不能显示,看看是不是接收的问题,估计还是数据出错
那说明显示图片的程序应该没错,线程就没了,应该是变量定义域的问题,你的一些变量是不是在线程中定义的,这样线程结束的时候这些变量就失效了。
另外,下次不能显示,看看是不是接收的问题,估计还是数据出错
#5
to 带图片的命令如直接用监听线程去显示图片,则界面会处于死机状态,主界面无法输入.
为什么不用委托来处理呢
参看
http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx
为什么不用委托来处理呢
参看
http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx
#6
我让监听线程又开了一个线程去显示图片,用pictureBox1.Invoke也不行,是不是我的代码有问题,大家看一下!
public void dealImage(System.IO.Stream portrait_stream)
{
//处理图片
if(portrait_stream==null)
{
EleRooms[EleRooms.Length-1].Visible=true;
this.pictureBox1.Visible=false;
}
else
{
EleRooms[EleRooms.Length-1].Visible=false;
this.pictureBox1.Visible=true;
EleRoom.GuiEleRoomServer.image=System.Drawing.Image.FromStream(portrait_stream);
Bitmap b = new Bitmap(EleRoom.GuiEleRoomServer.image, 112, 128);
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{b});
}
}
public void dealImage(System.IO.Stream portrait_stream)
{
//处理图片
if(portrait_stream==null)
{
EleRooms[EleRooms.Length-1].Visible=true;
this.pictureBox1.Visible=false;
}
else
{
EleRooms[EleRooms.Length-1].Visible=false;
this.pictureBox1.Visible=true;
EleRoom.GuiEleRoomServer.image=System.Drawing.Image.FromStream(portrait_stream);
Bitmap b = new Bitmap(EleRoom.GuiEleRoomServer.image, 112, 128);
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{b});
}
}
#7
刚刚这个忘记贴了,这个是代理.
public delegate void myDelegate(Image i);
public void finishDelegate(Image i)
{
EleRoom.GuiEleRoomServer.image=i;
this.pictureBox1.Image=EleRoom.GuiEleRoomServer.image;
this.pictureBox1.Refresh();
}
public delegate void myDelegate(Image i);
public void finishDelegate(Image i)
{
EleRoom.GuiEleRoomServer.image=i;
this.pictureBox1.Image=EleRoom.GuiEleRoomServer.image;
this.pictureBox1.Refresh();
}
#8
去掉这一句
Bitmap b = new Bitmap(EleRoom.GuiEleRoomServer.image, 112, 128);
然后把
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{b});
改成
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{EleRoom.GuiEleRoomServer.image});
Bitmap b = new Bitmap(EleRoom.GuiEleRoomServer.image, 112, 128);
然后把
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{b});
改成
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{EleRoom.GuiEleRoomServer.image});
#9
mark
#10
关注中……
#11
to:Knight94(愚翁)
改之前是闪一下,线程结束后图片没有了
改之后连闪都没闪,图片没有显示
看来不是这个.
改之前是闪一下,线程结束后图片没有了
改之后连闪都没闪,图片没有显示
看来不是这个.
#12
那可能是你的bitmap并没有真正生成。
#13
改之前是用bitmap的啊!
改之后就没用bitmap啊!
什么意思?
改之后就没用bitmap啊!
什么意思?
#14
看来是我的关于invoke的代理写的不对,
谁有现成的,关于子线程调用界面显示图片的通过invoke写的代码?
高手提供一个,或一些关键的语句.
先谢了!明天给分啊
谁有现成的,关于子线程调用界面显示图片的通过invoke写的代码?
高手提供一个,或一些关键的语句.
先谢了!明天给分啊
#1
看现象,应该是你显示图像的时候出错了,造成程序执行出错
#2
首先不能在另一個線程訪問界面,要用控件invoke方法。
最好你帖出代碼來??
最好你帖出代碼來??
#3
楼上说得相当的正确。要用Invoke方法。我记得微软的MSDN(中文)中有相关的论述。
#4
不好意思,看错了。原来图片能显示出来。
那说明显示图片的程序应该没错,线程就没了,应该是变量定义域的问题,你的一些变量是不是在线程中定义的,这样线程结束的时候这些变量就失效了。
另外,下次不能显示,看看是不是接收的问题,估计还是数据出错
那说明显示图片的程序应该没错,线程就没了,应该是变量定义域的问题,你的一些变量是不是在线程中定义的,这样线程结束的时候这些变量就失效了。
另外,下次不能显示,看看是不是接收的问题,估计还是数据出错
#5
to 带图片的命令如直接用监听线程去显示图片,则界面会处于死机状态,主界面无法输入.
为什么不用委托来处理呢
参看
http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx
为什么不用委托来处理呢
参看
http://blog.csdn.net/knight94/archive/2006/03/16/626584.aspx
#6
我让监听线程又开了一个线程去显示图片,用pictureBox1.Invoke也不行,是不是我的代码有问题,大家看一下!
public void dealImage(System.IO.Stream portrait_stream)
{
//处理图片
if(portrait_stream==null)
{
EleRooms[EleRooms.Length-1].Visible=true;
this.pictureBox1.Visible=false;
}
else
{
EleRooms[EleRooms.Length-1].Visible=false;
this.pictureBox1.Visible=true;
EleRoom.GuiEleRoomServer.image=System.Drawing.Image.FromStream(portrait_stream);
Bitmap b = new Bitmap(EleRoom.GuiEleRoomServer.image, 112, 128);
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{b});
}
}
public void dealImage(System.IO.Stream portrait_stream)
{
//处理图片
if(portrait_stream==null)
{
EleRooms[EleRooms.Length-1].Visible=true;
this.pictureBox1.Visible=false;
}
else
{
EleRooms[EleRooms.Length-1].Visible=false;
this.pictureBox1.Visible=true;
EleRoom.GuiEleRoomServer.image=System.Drawing.Image.FromStream(portrait_stream);
Bitmap b = new Bitmap(EleRoom.GuiEleRoomServer.image, 112, 128);
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{b});
}
}
#7
刚刚这个忘记贴了,这个是代理.
public delegate void myDelegate(Image i);
public void finishDelegate(Image i)
{
EleRoom.GuiEleRoomServer.image=i;
this.pictureBox1.Image=EleRoom.GuiEleRoomServer.image;
this.pictureBox1.Refresh();
}
public delegate void myDelegate(Image i);
public void finishDelegate(Image i)
{
EleRoom.GuiEleRoomServer.image=i;
this.pictureBox1.Image=EleRoom.GuiEleRoomServer.image;
this.pictureBox1.Refresh();
}
#8
去掉这一句
Bitmap b = new Bitmap(EleRoom.GuiEleRoomServer.image, 112, 128);
然后把
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{b});
改成
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{EleRoom.GuiEleRoomServer.image});
Bitmap b = new Bitmap(EleRoom.GuiEleRoomServer.image, 112, 128);
然后把
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{b});
改成
this.pictureBox1.BeginInvoke(new myDelegate(this.finishDelegate),new object[]{EleRoom.GuiEleRoomServer.image});
#9
mark
#10
关注中……
#11
to:Knight94(愚翁)
改之前是闪一下,线程结束后图片没有了
改之后连闪都没闪,图片没有显示
看来不是这个.
改之前是闪一下,线程结束后图片没有了
改之后连闪都没闪,图片没有显示
看来不是这个.
#12
那可能是你的bitmap并没有真正生成。
#13
改之前是用bitmap的啊!
改之后就没用bitmap啊!
什么意思?
改之后就没用bitmap啊!
什么意思?
#14
看来是我的关于invoke的代理写的不对,
谁有现成的,关于子线程调用界面显示图片的通过invoke写的代码?
高手提供一个,或一些关键的语句.
先谢了!明天给分啊
谁有现成的,关于子线程调用界面显示图片的通过invoke写的代码?
高手提供一个,或一些关键的语句.
先谢了!明天给分啊