现在主要是两方面的问题:
1、线程中断的问题。即文件处理当中的中断按钮的处理。
2、线程控制多个进度条的问题。
比如一个进度条按文件个数来增加,
一个进度条则与单个文件拷贝有关。

解决方案 »

  1.   

    如果是文件拷贝,则用CopyFileEx,该函数提供了回调的功能,通过这个回调可以知道当前进度
      

  2.   

    flyelf(空谷清音) 的 CopyFileEx用法不错
    拷贝少量文件时, 不必涉及多线程去解决, 如果要拷贝的文件量巨大, 界面线程不能有效更新, 这时就需要新开一个工作线程去完成.
      

  3.   

    yjgx007(谁是高手):
    是多个进度指示.
    我的拷贝的文件量很大
      

  4.   

    多个进度指示.
    你可以用我上次提供给你的类,做些修改,允许在线程中提供两套pos\range\step.第一套用于指示单个文件的进度(文件大小相关),第二套用于指示整体进度(文件数相关)
    具体显示的时候就同时查询两个pos,再分别刷新两个进度条控件的状态。中断:取决于
    你要中断当前文件copy,继续copy其他的。
    还是马上中断整个copy进度,
    还是等当前文件copy完毕再中断整个进度。
    第一种,你最好要和你的copy函数交互,不然就要每copy一个函数就开一个线程了。
    第二种,你直接在主界面线程中终止copy线程就好了
    第三种,你在线程中每copy完毕一个文件就查询一下某个状态值,如果与预期的不符合就退出。
      

  5.   

    第二种的那种,我现在就是想在主线程中把整个copy线程中断.
    包括拷贝动作和进度条.
    这里的标志就是通过用户点击进度条框上的中断按钮来控制
      

  6.   

    应该是在UI线程中控制进度条,及操作,在Worker线程中发UI线程发送自定义消息。
      

  7.   

    不清楚具体如何实现在主线程中断copy线程的操作。
      

  8.   

    TerminateThread是比较野蛮的做法,不提倡。我认为可以采用事件通知机制,文件处理线程定时查询某一个事件的状态,假如传信状态改变,则终止自身。更改事件传信状态,可以在主线程中进行。
      

  9.   

    TerminateThread是比较野蛮的做法,不提倡。
    你没有看前提,是需要立即中断并且无法和copy函数交互的时候,例如有一个dll提供给你去copy文件,你试试看能发信息通知它?
      

  10.   

    intothepain():
    枚举出所有文件
      

  11.   

    1、不知道主线程该如何跟copy线程交互。2、不知道TerminateThread如何用
    在主线程用的时候把主线程自己给全部关闭了.
    ......
    HANDLE hHandle = cp.CreateThreadWithProgress(this, &m_progress, TCopy, &Param);
    if (WaitForSingleObject(hHandle, 0) != WAIT_OBJECT_0)
    m_progress.Display("博朗电子书管理软件");
    if(quit_progress==1)
    {
                               CloseHandle(hHandle);
    ::GetExitCodeThread(hHandle,&dwExitCode);
    TerminateThread(hHandle,dwExitCode);
    }
    Sleep(50);
    WaitForSingleObject(hHandle, INFINITE);
    CloseHandle(hHandle);
    ......而且是在TCopy已经完成后,将整个程序都关掉。
      

  12.   

    void CShellListView::TCopy(LPVOID pParam)
    {
        CFormatTransfer cf;
        CString from=szSelected;
        CString to=m_strBrowse2;
        m_progress.SetPos(0);
        CopyFile(from,to,0);
        m_progress.SetPos(m_progress.GetRange());
    }
      

  13.   

    CloseHandle(hHandle);不能先close,close了以后handle就没法用了
    直接调用TerminateThread(hHandle,dwExitCode);随便给一个ExitCode,
    最后再CloseHandle.
      

  14.   

    1、不知道主线程该如何跟copy线程交互。
    用消息来交互
      

  15.   

    问题是我想在copy线程当中,也就是在拷贝正在进行中把它给关掉.
    当然线程在进行拷贝的过程,如何发消息啊.
    在之后和之前发消息对于我来说都没有什么意义
      

  16.   

    还是不清楚具体将TerminateThread(hHandle,dwExitCode)语句放哪里可以真正用得了.在拷贝过程当中,主线程没有机会终止线程啊?