请教个问题,我写了一个多线程的图像配准程序,使用的双核处理器我用的是多线程的编程, 运行时 cpu可以达到100%,现在我把这个程序以dll文件嵌入大一个大程序中,但是程序运行到这里时 cpu的使用率 不足 30%,请问是为什么, 在我的多线程程序中,因为程序需要我不断的开线程和关线程,是不是我这种操作引起的第一次发帖,希望知道的高手能帮帮忙.

解决方案 »

  1.   

    如果线程中执行了别人的代码,在别人的代码中只要执行了Sleep或等待函数,CPU使用率就不会是100%了。
      

  2.   

    楼上的好, 我的程序在进入配准后,全部是我自己的程序,没有用别人的 初步怀疑是我在程序中开关线程很频繁的原因,
    我程序中 多线程的等待都是 WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);而且在单独以exe运行时,基本可以保证总是 100%左右,这样速度很快,现在总是 30%左右,速度太慢了
      

  3.   

    代码在exe中和在dll中是没有差别的,有可能exe程序做了一些特殊的控制,例如设置进程只能在一个处理器上运行。
      

  4.   

    刚才 trace一下 发现 当作dll调用时,
    DWORD d1 = GetTickCount();
    HANDLE *h=new HANDLE[CpuNumbers];//修改了
    for(i=0;i<CpuNumbers;i++)
    {
    h[i]=::CreateThread(NULL,0,ThreadImage_MI,(LPVOID)ThreadParms[i],0,NULL);  
    }
    DWORD d2=GetTickCount();
    WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);----等待的时间变长了
    不知道是因为什么 难道我的WaitForMultipleObjects会等待调用我dll的主程序里面的线程???
      

  5.   

    程序的CPU使用率变低了,执行所需要的时间也就变长了,要等待所有线程结束自然也要多等一段时间,这很正常。
    因为是多线程同时运行,其中一个线程执行等待的时候,其它线程在运行,所以不会降低CPU的使用率,不是这里的问题。
      

  6.   

    检查一下线程函数. 等待多个线程的时候,即使有一个线程没完成也会拖延WaitForMultipleObjects()等待时间.
      

  7.   

    当内存不足,系统动用虚拟内存的时候,CPU利用率会降低至10%以下。
      

  8.   

    怀疑问题可能是出在消息处理上,
    你的dll是否与主程序频繁通过sendmessage通信?
      

  9.   

    你是不是在主进程中创建线程,然后用WaitForMultipleObjects?
    这会阻塞主进程的消息处理
    用MsgWaitForMultipleObjects
      

  10.   

    exe使用的是单核模式,没有针对多核进行特别优化 --- 仅仅是猜测
      

  11.   

    还有一个可能,你的dllmain是怎么处理DLL_THREAD_ATTACH/DLL_THREAD_DETACH的? 你每个创建/删除的线程都会调用dllmain的
      

  12.   

    代码在exe中和在dll中是没有差别的,有可能exe程序做了一些特殊的控制,例如设置进程只能在一个处理器上运行。
      

  13.   

    唉 刚才查出来了问题的所在,我用的两个线程,在线程的计算中 dll 和exe所花 的时间没有区别 
    但是 在WaitForMultipleObjects(CpuNumbers,h,TRUE,INFINITE);后 ,dll的运算时间增加了 800毫秒左右,而且无论是申请单线程和双线程的情况均如此。。CpuNumbers=1或CpuNumbers=2.
      

  14.   

    不是很清楚你的意思,你在DLL和EXE中不都是执行WaitForMultipleObjects等待吗?
    如果是双核分别运行你的线程,在只剩最后一个线程的时候,另一个处理器就空闲了,所以CPU不会一直100%。
      

  15.   

    回楼上的 是 在exe里面我可以运行到 100% 但是dll 只有不到30% 2线程的时候 而且dll中虽然运行时间长但是也可以得到正确的结果和exe的结果一样 太颓了 最后了出现这样的问题,本来都准备交项目了
      

  16.   

    你在EXE和DLL中执行的代码都是相同的吧?
    你可以这样试一下,自己另做一个EXE程序来加载这个DLL,如果可以达到100%就说明问题出在EXE程序上。
      

  17.   

    过低?难道楼主想CPU使用率达到100%?
      

  18.   

    回楼上的: 是啊 因为计算量较大,所以才用双线程的 在exe中的我的程序几乎就是100%
    然后,今天做个一个试验,就是在线程里写了一个while(1)的循环,发现cpu的使用率就上去了100%
    而且我还用了一个纯数学计算的循环,计算量较大,我发现cpu使用率是一个锯齿状 100%-30%,所以所以我就怀疑是因为我在线程中计算量较小,计算时间大概为150ms每次 ,但是我每次都需要要申请一次线程来计算,所以这样拖慢了。
    但是有点也不明白了 为什么exe中 和dll同样的程序, 结果却不同看文章看到一个这样的说法: 不知道大家知道不。。
     那么如何提高程序的性能?如果是和msvcrt.dll动态链接的,保证这个dll是1999年2月以后,并且安装的service pack的版本是5或更高。如果是静态链接的,保证链接程序的版本号是6或更高,可以用quickview.exe程序检查这个版本号。要改变所要运行的程序的堆函数的选取,在命令行下键入以下命令:set __MSVCRT_HEAP_SELECT=__GLOBAL_HEAP_SELECTED,1