急求多线程控制进度条的方法。有源码最好(续)-- 现在主要是两方面的问题:1、线程中断的问题。即文件处理当中的中断按钮的处理。2、线程控制多个进度条的问题。比如一个进度条按文件个数来增加,一个进度条则与单个文件拷贝有关。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是文件拷贝,则用CopyFileEx,该函数提供了回调的功能,通过这个回调可以知道当前进度 flyelf(空谷清音) 的 CopyFileEx用法不错拷贝少量文件时, 不必涉及多线程去解决, 如果要拷贝的文件量巨大, 界面线程不能有效更新, 这时就需要新开一个工作线程去完成. yjgx007(谁是高手):是多个进度指示.我的拷贝的文件量很大 多个进度指示.你可以用我上次提供给你的类,做些修改,允许在线程中提供两套pos\range\step.第一套用于指示单个文件的进度(文件大小相关),第二套用于指示整体进度(文件数相关)具体显示的时候就同时查询两个pos,再分别刷新两个进度条控件的状态。中断:取决于你要中断当前文件copy,继续copy其他的。还是马上中断整个copy进度,还是等当前文件copy完毕再中断整个进度。第一种,你最好要和你的copy函数交互,不然就要每copy一个函数就开一个线程了。第二种,你直接在主界面线程中终止copy线程就好了第三种,你在线程中每copy完毕一个文件就查询一下某个状态值,如果与预期的不符合就退出。 第二种的那种,我现在就是想在主线程中把整个copy线程中断.包括拷贝动作和进度条.这里的标志就是通过用户点击进度条框上的中断按钮来控制 应该是在UI线程中控制进度条,及操作,在Worker线程中发UI线程发送自定义消息。 不清楚具体如何实现在主线程中断copy线程的操作。 TerminateThread是比较野蛮的做法,不提倡。我认为可以采用事件通知机制,文件处理线程定时查询某一个事件的状态,假如传信状态改变,则终止自身。更改事件传信状态,可以在主线程中进行。 TerminateThread是比较野蛮的做法,不提倡。你没有看前提,是需要立即中断并且无法和copy函数交互的时候,例如有一个dll提供给你去copy文件,你试试看能发信息通知它? intothepain():枚举出所有文件 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已经完成后,将整个程序都关掉。 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());} CloseHandle(hHandle);不能先close,close了以后handle就没法用了直接调用TerminateThread(hHandle,dwExitCode);随便给一个ExitCode,最后再CloseHandle. 1、不知道主线程该如何跟copy线程交互。用消息来交互 问题是我想在copy线程当中,也就是在拷贝正在进行中把它给关掉.当然线程在进行拷贝的过程,如何发消息啊.在之后和之前发消息对于我来说都没有什么意义 还是不清楚具体将TerminateThread(hHandle,dwExitCode)语句放哪里可以真正用得了.在拷贝过程当中,主线程没有机会终止线程啊? 求封装HTTP的C++库 DateTimePicker如何设置才能同时显示日期与时间? .和->的区别是什么 请教问题,关于SQL6.5和OLEDB的。希望能有解决方法 怎样保存一个位图为.bmp格式的文件 请问如何将字符串变量转换成整型和浮点型变量,多谢各位高手指点 菜鸟的关于CSocket阻塞的问题,请求帮助!!! 如何锁住整个窗口, IE首页被锁死,也不能修改咋办? 数据类型问题提问?? MoveTo(hdc,0,1); //这句话的意思,以及为什么有错误! 给了合理的解释的 就有分!希望大家都看看 如何实现这个定时查询功能?
拷贝少量文件时, 不必涉及多线程去解决, 如果要拷贝的文件量巨大, 界面线程不能有效更新, 这时就需要新开一个工作线程去完成.
是多个进度指示.
我的拷贝的文件量很大
你可以用我上次提供给你的类,做些修改,允许在线程中提供两套pos\range\step.第一套用于指示单个文件的进度(文件大小相关),第二套用于指示整体进度(文件数相关)
具体显示的时候就同时查询两个pos,再分别刷新两个进度条控件的状态。中断:取决于
你要中断当前文件copy,继续copy其他的。
还是马上中断整个copy进度,
还是等当前文件copy完毕再中断整个进度。
第一种,你最好要和你的copy函数交互,不然就要每copy一个函数就开一个线程了。
第二种,你直接在主界面线程中终止copy线程就好了
第三种,你在线程中每copy完毕一个文件就查询一下某个状态值,如果与预期的不符合就退出。
包括拷贝动作和进度条.
这里的标志就是通过用户点击进度条框上的中断按钮来控制
你没有看前提,是需要立即中断并且无法和copy函数交互的时候,例如有一个dll提供给你去copy文件,你试试看能发信息通知它?
枚举出所有文件
在主线程用的时候把主线程自己给全部关闭了.
......
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已经完成后,将整个程序都关掉。
{
CFormatTransfer cf;
CString from=szSelected;
CString to=m_strBrowse2;
m_progress.SetPos(0);
CopyFile(from,to,0);
m_progress.SetPos(m_progress.GetRange());
}
直接调用TerminateThread(hHandle,dwExitCode);随便给一个ExitCode,
最后再CloseHandle.
用消息来交互
当然线程在进行拷贝的过程,如何发消息啊.
在之后和之前发消息对于我来说都没有什么意义