为何在其他进程的UI切换时会影响我程序中的线程?

河西石头 2012-06-27 04:38:16
背景是这样的:
我做了一个socket通讯程序,每个端口建立一个socket连接,每打开一个连接就建立一个监听线程(打开连接的事件在主线程中触发),这个线程负责监听收到的报文,一旦收到就写入指定的文本(写入前我会验证其正确性),从设计思路上看应该是没有问题的。但当我在不同进程之间切换时就会出现监听线程暂停,等UI切换结束后监听线程才恢复工作(从收到的报文可以看出,因为在UI切换时收到的报文会累积一大堆在接收缓冲区中),望高手解答,整了很久了。
...全文
125 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
河西石头 2012-06-28
  • 打赏
  • 举报
回复
轮询时没有时间间隔的,继续顶起来。
我就想消除这种影响,否则我的通讯失败了
河西石头 2012-06-28
  • 打赏
  • 举报
回复
必须再顶一下,有没有人能够帮助我啊
河西石头 2012-06-27
  • 打赏
  • 举报
回复
目前就只有两个线程,一个是主线程,一个是监听线程,CPU占用率算高达到了6到11%,我现在就想利用这个监听线程来接收socket的回复报文,但经常会因为UI切换的时候出现回复报文“迟到”,查其原因就是因为UI切换的时候貌似监听先听停止了工作,所以报文会堆积在socket的缓冲中,等到监听线程恢复工作时缓冲区中就有大量的数据了,这个时候可能就出现了前包的包尾粘到了后包的包头,所谓的“粘包”现象。真不知道如何解决。况且就算不粘包,根据报文的回复等待时间极限值来看,也算是超时了,串口通讯的时候算作通讯失败了
cheng2005 2012-06-27
  • 打赏
  • 举报
回复
轮询没有时间间隔?你的CPU占用率不高吗?
具体开了多少个线程?
河西石头 2012-06-27
  • 打赏
  • 举报
回复
对了,需要说明一下,vport是一个串口对象,上面的代码是监听的内容,监听的线程是在主线程中触发的。
河西石头 2012-06-27
  • 打赏
  • 举报
回复
有这么一个切换动作我承认,但这个动作不至于使现在这种2G以上的CPU产生明显停顿您说呢?不会说你在听歌的时候切换到word就会感觉到歌停了一下才能够切换到word,对不?
我的监听线程如下:

try
{

int counter = 0;
while (dolisten)
{
if (vport.ActiveState==1)
{
Byte[] recvBytes = new Byte[4000];
int len= vport.PortSocket.Receive(recvBytes);
//int len = vport.PortSocket.Available;
//vport.PortSocket.BeginReceive(recvBytes, 0, len, SocketFlags.None, null, null);

vport.RXbytesCount = vport.RXbytesCount + len;

//UI显示更新
showRT(vport.RXbytesCount, listView1, vport.PortName);

byte[] tempbuf=new byte[len];
Buffer.BlockCopy(recvBytes, 0, tempbuf, 0, len);


string tempstr=byteArrytoString(tempbuf);



if (tempstr.Contains("64 03 9E") && vport.tansCounter > 5)
{
if (counter != 163)
vport.StrWriter.WriteLine("failed in " + vport.tansCounter.ToString());

}


counter = counter + len;

if (tempstr.Contains("64 03 9E"))
{
//如果检测到MODBUS包头,则重置计数器


counter = len;

}




vport.StrWriter.WriteLine("[" + DateTime.Now.ToString() + ":"
+ DateTime.Now.Millisecond.ToString("D3")
+ "]:" + tempstr + "[" + len.ToString() + " bytes," + counter.ToString() + "]");

}
catch
{
.....
}
cheng2005 2012-06-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

那照你这么说一般的播放软件在切换的时候音乐或者视频都必须停下来????我觉得你的理解不是太对
[/Quote]
不是必须停下来,而是有一个进程切换的动作。这个动作的长短取决于两个进程的进程域的复杂程度。

比如,你用一台比较差的机器看高清电影,你就会发现在播放器和别的程序间进行切换会有明显的停顿,甚至会有假死的现象。

当然,现在的操作系统都是多进程的,不在前台的进程也有机会得到CPU,不过这是操作系统来控制的。但是切换窗口的时候是必然会切换进程的,因为前台进程只能有一个。
__天涯寻梦 2012-06-27
  • 打赏
  • 举报
回复
从你的描述上看不出什么问题,要不你把监听代码贴出来看下
河西石头 2012-06-27
  • 打赏
  • 举报
回复
那照你这么说一般的播放软件在切换的时候音乐或者视频都必须停下来????我觉得你的理解不是太对
河西石头 2012-06-27
  • 打赏
  • 举报
回复
您的意思这属于正常现象?你的意思是切换的时候进程中的所有线程必须暂停?
cheng2005 2012-06-27
  • 打赏
  • 举报
回复
线程是进程的一部分,当进程切换的时候,线程当然也要进行切换。

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧