监听线程显示图片问题!高手一定来看看!版主也来啊!

时间:2021-08-01 01:18:57
我的东西是这样的.
一个客户端程序的监听线程监听服务器端发来的命令,有的命令带图片,有的不带.
不带图片的命令,作动作都没关系,
问题是:带图片的命令如直接用监听线程去显示图片,则界面会处于死机状态,主界面无法输入.
如另开一个线程来做带图片的命令,则图片在线程结束时就没有了.
我该怎么办?
是什么原因造成的?
为什么用监听线程去显示图片,界面会处于死机状态,而如果没有显示图片,则没有关系.一切正常.
为什么用另一个新线程显示图片,图片在线程结束时就没有了.而且再有命令传来时,图片再也不显示了?

14 个解决方案

#1


看现象,应该是你显示图像的时候出错了,造成程序执行出错

#2


首先不能在另一個線程訪問界面,要用控件invoke方法。
最好你帖出代碼來??

#3


楼上说得相当的正确。要用Invoke方法。我记得微软的MSDN(中文)中有相关的论述。

#4


不好意思,看错了。原来图片能显示出来。

那说明显示图片的程序应该没错,线程就没了,应该是变量定义域的问题,你的一些变量是不是在线程中定义的,这样线程结束的时候这些变量就失效了。

另外,下次不能显示,看看是不是接收的问题,估计还是数据出错

#5


to 带图片的命令如直接用监听线程去显示图片,则界面会处于死机状态,主界面无法输入.

为什么不用委托来处理呢
参看
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});
}
}

#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();
}

#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});

#9


mark

#10


关注中……

#11


to:Knight94(愚翁) 
改之前是闪一下,线程结束后图片没有了
改之后连闪都没闪,图片没有显示
看来不是这个.

#12


那可能是你的bitmap并没有真正生成。

#13


改之前是用bitmap的啊!
改之后就没用bitmap啊!
什么意思?

#14


看来是我的关于invoke的代理写的不对,
谁有现成的,关于子线程调用界面显示图片的通过invoke写的代码?
高手提供一个,或一些关键的语句.
先谢了!明天给分啊

#1


看现象,应该是你显示图像的时候出错了,造成程序执行出错

#2


首先不能在另一個線程訪問界面,要用控件invoke方法。
最好你帖出代碼來??

#3


楼上说得相当的正确。要用Invoke方法。我记得微软的MSDN(中文)中有相关的论述。

#4


不好意思,看错了。原来图片能显示出来。

那说明显示图片的程序应该没错,线程就没了,应该是变量定义域的问题,你的一些变量是不是在线程中定义的,这样线程结束的时候这些变量就失效了。

另外,下次不能显示,看看是不是接收的问题,估计还是数据出错

#5


to 带图片的命令如直接用监听线程去显示图片,则界面会处于死机状态,主界面无法输入.

为什么不用委托来处理呢
参看
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});
}
}

#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();
}

#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});

#9


mark

#10


关注中……

#11


to:Knight94(愚翁) 
改之前是闪一下,线程结束后图片没有了
改之后连闪都没闪,图片没有显示
看来不是这个.

#12


那可能是你的bitmap并没有真正生成。

#13


改之前是用bitmap的啊!
改之后就没用bitmap啊!
什么意思?

#14


看来是我的关于invoke的代理写的不对,
谁有现成的,关于子线程调用界面显示图片的通过invoke写的代码?
高手提供一个,或一些关键的语句.
先谢了!明天给分啊