关于clistctrl中用for循环创建进程为何只执行最后一个?

老林头 2013-09-29 09:08:09
不好意思,纯新人,没用过vc,最近在学这东西,用clistctrl建立了一个列表,选择多个的时候只执行最后一行的创建目录?代码如下:
如果有2行的话,创建进程的时候,只创建最后一个目录,前面的两个都不创建。

void CdxDlg::OnDownload()
{
// TODO: 在此添加命令处理程序代码

CString str;
for(int i=0; i<m_ListCtrl.GetItemCount(); i++)
{
if( m_ListCtrl.GetItemState(i, LVIS_SELECTED) == LVIS_SELECTED )
{
CString downloadstr;

downloadstr=m_ListCtrl.GetItemText(i,0);
if (downloadstr != "准备下载")
{
MessageBox("下载地址不正确", "提示", MB_ICONINFORMATION | MB_OK);
ready = FALSE;

}
else
{
ready = TRUE;
}
//如果可以下载,则开始进行下载处理。

if (ready == TRUE)
{
bookname=m_ListCtrl.GetItemText(i,2);
booknumber=m_ListCtrl.GetItemText(i,3);

HANDLE hwndreal=CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)threadfun,NULL,0,0);
CloseHandle(hwndreal);

}
}





}

}


void threadfun()
{
if (bookname != "")
{
strcpy(savepath,defaultpath);
lstrcat(savepath,bookname);
lstrcat(savepath,booknumber);
}
lstrcat(savepath,"\\");
CreateDirectory(savepath,NULL);
TCHAR output[MAX_PATH];
sprintf(output,"%s%s",savepath,"output");
CreateDirectory(output,NULL);


}
...全文
577 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
昨夜无风 2013-10-02
  • 打赏
  • 举报
回复
多选的时候你会创建多个线程,多个线程又都调用 threadfun 函数,而当第一个线程可能还没执行CreateDirectory的时候,你的bookname和booknumber就已经被你改变。 修改方法: 1. 要么不用线程,直接在OnDownload()中CreateDirectory 2. 要么使用全局的defaultpath、bookname和booknumber数组,启动一个线程后就调用相应的数组
路人乙2019 2013-10-02
  • 打赏
  • 举报
回复
if( (m_ListCtrl.GetItemState(i, LVIS_SELECTED)&LVIS_SELECTED)==LVIS_SELECTED )
91program 2013-10-01
  • 打赏
  • 举报
回复
创建线程后,sleep 一会吧
老林头 2013-10-01
  • 打赏
  • 举报
回复
循环是进去了,但是第一次循环,直接关闭进程,第二次才进线程。 我试试把这个改成全局之后在进程函数中关闭试试
真相重于对错 2013-09-29
  • 打赏
  • 举报
回复
HANDLE hwndreal=CreateThread (NULL,0,(LPTHREAD_START_ROUTINE)threadfun,NULL,0,0); CloseHandle(hwndreal); 刚create后 就close了
threenewbee 2013-09-29
  • 打赏
  • 举报
回复
自己下几个断点,看看循环有没有走进去。
threenewbee 2013-09-29
  • 打赏
  • 举报
回复
自己下几个端点,看看循环有没有走进去。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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