您的位置:程序门 -> vc/mfc -> 进程/线程/dll



关于多线程的问题!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


关于多线程的问题![已结贴,结贴人:qqqqqqpppp]
发表于:2007-01-21 14:42:54 楼主
程序根据不同条件给同一函数a传递不同参数,启动多线程,当在单线程条件下,函数a正常运行,但是在多线程条件下,只有最后启动的线程工作,而且也不能保证正常运行.前面启动的线程根本不工作,根据createthread和getlasterror返回值,都显示正常.这到底是怎么回事呢?请各位高手给些建议!小弟比较穷,只能给20分了!谢谢!
发表于:2007-01-21 14:51:271楼 得分:0
猜点代码吧。
发表于:2007-01-21 14:54:122楼 得分:0
“帖”,奇怪,怎么打成“猜”。。。。。
发表于:2007-01-21 16:43:033楼 得分:0
void   winapi     monitordirectory(lpstr   path)  

{

  handle   hdir;  
char   notify[1024],   tmp[256];  
dword   cbbytes,i;  
char   ansichar[3];  
wchar_t   unicodechar[2];  
file_notify_information   *pnotify=(file_notify_information   *)notify;  
file_notify_information   *tmp;  
strcpy(tmp   ,   path);
hdir   =   createfile(   tmp   ,file_list_directory,   file_share_read   ¦   file_share_write   ¦   file_share_delete,   null,   open_existing,   file_flag_backup_semantics   ¦   file_flag_overlapped,   null);  
if   (hdir   ==   invalid_handle_value)   {   printf( "hdir:invalid_handle_value ");  
return;  
}  
  while   (true)  
{  
if(readdirectorychangesw(hdir,   notify,   sizeof(notify),   false,   file_notify_change_file_name ¦   file_notify_change_last_write,   &cbbytes,   null,   null))  
{  
//   printf( "readdirectorychangesw   success\n ");  
tmp   =   pnotify;  
do
{  
switch(tmp-> action)  
{  
case   file_action_added:   printf( "directory/file   added   -   ");   break;  
case   file_action_removed:   printf( "directory/file   removed   -   ");   break;  
case   file_action_modified:   printf( "directory/file   modified   -   ");   break;  
case   file_action_renamed_old_name:   printf( "directory/file   old   name   -   ");   break;  
case   file_action_renamed_new_name:   printf( "directory/file   new   name   -   ");   break;  
default:   break;  
}
//end   switch  
for(i=0;i <tmp-> filenamelength/2;i++)  
{  
unicodechar[0]=tmp-> filename[i];  
unicodechar[1]=0;  
zeromemory(ansichar,3);
  widechartomultibyte(cp_acp,0,unicodechar,-1,ansichar,3,null,null);  
printf( "%s ",ansichar);  
}  
printf( "\n ");  
if(tmp-> nextentryoffset   !=0)  
{  
i   =   tmp-> nextentryoffset;  
tmp   =   (pfile_notify_information)   ((lpbyte)tmp+i);  
}   else   break;   }while(1);   }
//end   if  
else   printf( "readdirectorychangesw   error\n ");  
}//end   while

  }
代码如上,也是从网上copy来的,给它传递不同的参数,就监控了不同的文件夹,但是多线程的时候就不行了.
发表于:2007-01-22 14:45:414楼 得分:20
我试了,代码没问题啊??

#include   "stdafx.h "

uint   winapi     monitordirectory(void   *param);

int   main(int   argc,   char*   argv[])
{
char   spath[256];
char   spath2[256];
strcpy(spath, "c:\\ ");
strcpy(spath2, "d:\\ ");

_beginthreadex(null,0,monitordirectory,spath,0,null);
_beginthreadex(null,0,monitordirectory,spath2,0,null);
while   (true)   {
sleep(10000);
}
return   0;
}

uint   winapi     monitordirectory(void   *param)

{

handle   hdir;  
char   notify[1024],   tmp[256];  
dword   cbbytes,i;  
char   ansichar[3];  
wchar_t   unicodechar[2];  
file_notify_information   *pnotify=(file_notify_information   *)notify;  
file_notify_information   *tmp;  
strcpy(tmp   ,   (char*)param);
hdir   =   createfile(   tmp   ,file_list_directory,   file_share_read   ¦   file_share_write   ¦   file_share_delete,   null,   open_existing,   file_flag_backup_semantics   ¦   file_flag_overlapped,   null);  
if   (hdir   ==   invalid_handle_value)   {   printf( "hdir:invalid_handle_value ");  
return   0;  
}  
while   (true)  
{  
if(readdirectorychangesw(hdir,   notify,   sizeof(notify),   false,   file_notify_change_file_name ¦   file_notify_change_last_write,   &cbbytes,   null,   null))  
{  
//   printf( "readdirectorychangesw   success\n ");  
tmp   =   pnotify;  
do
{  
switch(tmp-> action)  
{  
case   file_action_added:   printf( "\ndirectory/file   added   -   ");   break;  
case   file_action_removed:   printf( "\ndirectory/file   removed   -   ");   break;  
case   file_action_modified:   printf( "\ndirectory/file   modified   -   ");   break;  
case   file_action_renamed_old_name:   printf( "\ndirectory/file   old   name   -   ");   break;  
case   file_action_renamed_new_name:   printf( "\ndirectory/file   new   name   -   ");   break;  
default:   break;  
}
//end   switch  
for(i=0;i <tmp-> filenamelength/2;i++)  
{  
unicodechar[0]=tmp-> filename[i];  
unicodechar[1]=0;  
zeromemory(ansichar,3);
widechartomultibyte(cp_acp,0,unicodechar,-1,ansichar,3,null,null);  
printf( "%s ",ansichar);  
}  
if(tmp-> nextentryoffset   !=0)  
{  
i   =   tmp-> nextentryoffset;  
tmp   =   (pfile_notify_information)   ((lpbyte)tmp+i);  
}   else   break;   }while(1);   }
//end   if  
else   printf( "readdirectorychangesw   error\n ");  
}//end   while
return   0;
}
发表于:2007-01-22 15:50:465楼 得分:0
谢谢microyzy了,原来是工程设置里的问题,真的谢谢啦.还有个一个小问题,就是readdirectorychangesw函数,为什么一个文件修改后,它会识别两次呢?再次谢谢啦!
发表于:2007-01-22 16:56:166楼 得分:0
这个我8清楚啦,呵呵,这个函数我也没用过,可能跟你设置的参数有关吧:
file_notify_change_file_name ¦   file_notify_change_last_write

你换换参数试试
发表于:2007-01-22 19:04:257楼 得分:0
试试先,不过还是很感谢啦,结贴老!


快速检索

最新资讯
热门点击