当前位置:首页
开发技术指南» 文章正文
    引言:
 

 

    摘要: 是不是只要安装.framework就成了? 还是要把vs.net全部安装? ......
 ·高手关于msflexgrid控件的问题    »显示摘要«
    摘要: 如何禁止多选?急,谢谢! ......


我的程序为什么会没有响应请大家帮我分析一下

我的程序是一个对话框的程序,从某个目录读取文件然后进行处理,为了不使程序忙于处理而不响应用户操作,然后我就开了个线程进行文件处理。流程如下:  
  class   CProcessThread   :   public   CWinThread  
   
  BOOL   CProcessThread::InitInstance()  
  {  
  //   TODO:     perform   and   per-thread   initialization   here  
  //程序初始化,如初始化失败则返回FALSE  
  .......  
  return   TRUE;  
  }  
  int   CProcessThread::Run()    
  {  
  HANDLE   h=FindFirstChangeNotification(m_Path,FALSE,FILE_NOTIFY_CHANGE_FILE_NAME);  
  while(1)  
  {  
  //读取目录下的文件,将新的文件放入文件列表  
  .....  
  //从列表中取出文件名,进行处理,其中要对MS   SQL2000存取数据  
  .....//是一个自上而下的处理,程序经常在这没有响应,但这里面没有任何等待信号量的操作  
  //处理完后等待新的文件生成  
  if(FindNextChangeNotification(h)==0)  
      break;  
  while(WaitForSingleObject(h,50)!=WAIT_OBJECT_0)  
  {  
  MSG   msg;  
  if(PeekMessage(&msg,   NULL,   0,   0,   PM_REMOVE))      
  if(   msg.message   ==   WM_QUIT   )//   主线程要求退出  
  {  
  ExitInstance();  
  return   CWinThread::Run();  
  }  
  }  
  }  
  }  
  操作系统为Win2000Server,机器为研华工控。以前发现经常在出现屏保后程序就没有响应,后来去掉屏保,去掉睡眠,大概快到三个小时,程序又没有响应了,且文件列表中的文件都还没有处理完。  
  这个问题困挠我很久了,以前的程序是命令行的,没有界面,也没有线程,处理正常,所以处理文件部分应该没有问题。  
  另外,为了表明程序在工作,我还加载了一个GIF类来显示GIF动画,它里面也开了一个线程。  
  问题就是这样,大家说说哪里可能会有问题啊?不胜感激!

NO.1   作者: AplusMartin

你在while最後加一個sleep(n),n由你定,,因為你的while沒有停止,windows分的時間片全被你的線程給占了.多線程實際上沒有起到做用,或者你不要用RUN.  
  用WinThread::PostThreadMessage()激活線程中的函數.來處理你要完成的工作.這樣的話,線程的運作時間就完全由windows分配了...我做的CTI系統就是這樣的...運行的很好

NO.2   作者: chenybin

UP

NO.3   作者: mul

用sleep(..)或event(wiatforsingleobject())都可解决  
 

NO.4   作者: ammycute

同意  
 

NO.5   作者: atling

我想你不应该在PeekMessage   中使用   PM_REMOVE  
  你说的程序没有响应是什么现象?任务管理器里看到的你的进程的cpu占用率是多少?  
  根据你说的,我看跟sleep,waitforsingleobject   都无关。  
  另外,你使用消息队列的退出控制不好,不如直接用一个变量控制。

NO.6   作者: atling

你为什么要用PeekMessage   将msg取走,又不处理?    
  你要么PeekMessage(&msg,   NULL,   0,   0,   PM_NOREMOVE))  
  要么加上  
  TranslateMessage(&msg);  
  DispatchMessage(&msg);  
 

NO.7   作者: Saimen

我百分百同意这位同志说的!  
  我开始时也是和您一样,后来改为消息驱动加信号量  
   
  因為你的while沒有停止,windows分的時間片全被你的線程給占了.多線程實際上沒有起到做用,或者你不要用RUN.  
  用WinThread::PostThreadMessage()激活線程中的函數.來處理你要完成的工作.這樣的話,線程的運作時間就完全由windows分配了...  
 

NO.8   作者: dongfa

以下好像有问题:  
  {  
  ExitInstance();  
  return   CWinThread::Run();  
  }  
 

NO.9   作者: merlin_jn

Run函数在整个线程周期中之运行一次,函数退出时,也就是线程退出。这个函数的默认处理是不断的接收消息并分发消息。  
   
  ==>   while(WaitForSingleObject(h,50)!=WAIT_OBJECT_0)  
   
  这个处理正确吗?要确保有WaitForSingleObject(h,50)==WAIT_OBJECT_0成立的条件。  
   
  ==〉if(   msg.message   ==   WM_QUIT   )//   主线程要求退出  
  能得到这个消息吗?  
   
 


    摘要: 如题 ......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE