各位好!现在有这样一个问题,之前的程序是在XP上开发的,但是由于现在XP已经停产了,所以要到WIN7下运行。程序运行的时候,开了9个线程,4个处理线程,4个保存文件线程,1一个IO查询线程。IO查询线程是一直在查询输入口,如果有对应的处理,就激活某个处理线程去处理,但是线程处理的过程中,又要使用IO来发送一些处理结果。所以在查询线程和处理线程中,都对IO的查询加了锁,使用EnterCriticalSection和LeaveCriticalSection来控制。这样的做法在XP下是正常的。触发信号可以正常激活处理,处理也能顺利发送处理结果。但是现在在WIN7下有如下问题: 在收到触发信号,处理过程中,在发送结果之前,先EnterCriticalSection,这个进入临界区的时间非常的慢,时间在几百毫秒到几千毫秒不等。正常情况下远小于一个毫秒。分析应该是IO查询线程一直在查询IO,在不停的进入临界区,查询,退出临界区操作。可能是由于WIN7系统对于线程管理的部分与XP不同,导致这个线程运行过于频繁,其他线程抢占不到这个临界区。所以想问两个问题:
1。这个分析是正确的吗? 异或有其他解释?
2。如果解决这个问题?谢谢!灰常灰常急!再谢。另外  CPU 是 I7 四核八线程 使用了一块PCIE的图像采集卡 使用了一块PCI的IO卡 希望能有帮助

解决方案 »

  1.   

    程序是使用 Visual Studio 2005 编译的
      

  2.   

    你的I/O查询线程为什么要循环查询,没有异步回调机制吗,I/O操作最好用异步。
    你可以分析一下LPCRITICAL_SECTION结构体,看是被哪个线程占用了。
      

  3.   

    建议换到win7下编译下,这种问题,谁也说不清楚
      

  4.   

    不在WIN7下编译一下 XP的程序能在WIN7下运行吗已经是在WIN7下编译过的了是在WIN7下编译在WIN7下运行的程序 与在XP下编译在XP下运行的程序 运行结果不同
      

  5.   

    你的I/O查询线程为什么要循环查询,没有异步回调机制吗,I/O操作最好用异步。
    你可以分析一下LPCRITICAL_SECTION结构体,看是被哪个线程占用了。谢谢! 我看一看是否可以使用您的意见试一下
      

  6.   

    你可以分析一下LPCRITICAL_SECTION结构体,看是被哪个线程占用了。是被IO查询线程占用了 因为一直在查询
      

  7.   

    你可以改改查询线程嘛,俺的东西简单,偶尔用到线程查询,查不到就sleep一会儿,就是不知道到人那是否合适。
      

  8.   


    难道楼主的查询进程里面没有停顿?导致CPU资源全被查询线程用完
      

  9.   

    不想用Sleep,可以选用触发机制,有改变就通知IO线程
      

  10.   

    EnterCriticalSection -> IO查询(费时) -> 写共享内存 ->LeaveCriticalSection改为IO查询(费时) -> EnterCriticalSection -> 写共享内存 ->LeaveCriticalSection以上仅是猜测. 
    你最好找到上锁与解锁之间的那个费时间的动作来自哪里.如果不存在这个费时操作, 难道是你的IO线程优先级太高? 疑惑中.
      

  11.   

    首先看看你的CPU和内存占用率,CPU或内存使用率过高可能会导致这个问题。其次用SetThreadPriority()函数把需要快速执行的线程优先级设置高一些,至少为THREAD_PRIORITY_ABOVE_NORMAL
      

  12.   

    IO等待的时候最好不用同步,这样浪费太大的时间,用异步,比如串口操作最好就用异步,否则太费时间,然后用waitforsigalobject等待,这样非常的节省时间
      

  13.   

    很奇怪IO线程因为没有事件可以通知 所以目前只好一直查询如果不加Sleep(1) 把Lock UnLock去掉 也是会很慢 但是其他线程都是等待Input线程触发的 也就是说没有Input线程触发的时候 其他线程等待 只有Input线程一个线程在循环查询 当有一个触发时 会激活其中一个处理线程 处理线程里会输出一下output 输出的时候是加了Lock Unlock的 这个时候又会很慢但是如果我不加Sleep(1) 只是通过时钟频率等待几个微秒的时候 线程又是一切正常的不得其解