注册 登录
编程论坛 VC++/MFC

求例子 :怎样用MFC编程实现一个程序同时执行多个相同任务(批量处理)?

南庭 发布于 2014-03-01 20:53, 991 次点击
在MFC的列表框内,一次性添加多个要处理的文本的路径,然后根据路径用相同的一个程序同时处理这些文本,求例解?
12 回复
#2
wp2319572014-03-01 20:54
同时处理  ?  开N个线程 ?
#3
yuccn2014-03-02 12:18
“同时处理”是怎么定义?如果是n个任务,要求一个用户交互的话,直接一个for循环就ok了。
或者用万版的说法,开线程。
#4
南庭2014-03-03 09:29
可能是我本人表达有点问题 意思是说实现一次性打开多个不同的文本  调用同一函数模块全部进行相同的处理操作 达到批量处理的效果
#5
南庭2014-03-03 09:31
回复 3楼 yuccn
有没有实例 参考一下 谢谢!
#6
yuccn2014-03-03 11:06
没有事例,自己弄吧,多线程~
#7
玩出来的代码2014-03-03 16:46
批量处理和并行处理不是一个概念
#8
南庭2014-03-03 17:22
回复 7楼 玩出来的代码
抱歉 让你见笑了 第一次做这些东西 我希望做的事就是同一时间内要调用同一函数  如果把一次调用看成一次任务的话 那么达到的效果就是多个任务同时进行 节省时间  希望给与指点 谢谢
#9
wp2319572014-03-03 17:34
多线程的也没怎么玩过

好像100个文件同时处理(开100个线程) 的时间 也不会是顺序处理的  百分之一吧
#10
南庭2014-03-03 20:30
回复 3楼 yuccn
求高手赐教,给点例子,只需要能让多个线程同时调用同一个函数,处理任务的,谢了!
#11
南庭2014-03-03 20:39
CString  fname[3000];
CString  name[1024] ;
int j1 ;
int nIndex = 0;
void CDisposeXJXDlg::OnBtnSelSrcFile()
{
    // TODO: Add your control notification handler code here


    CFileDialog dlg(TRUE, NULL, NULL ,OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT
        |OFN_ALLOWMULTISELECT,"(*.fbd) | *.fbd||",AfxGetMainWnd());

    TCHAR* pszFile =new TCHAR[MAX_PATH];
    memset(pszFile,0,sizeof(TCHAR)*MAX_PATH);

    dlg.m_ofn.lpstrFile = pszFile ;


    if(IDOK==dlg.DoModal())
    {

        int i = 0 ;
        POSITION pos ;
        //把起始位置赋给pos

        pos = dlg.GetStartPosition();
        //把打开的多个文件名赋给fname数组
        while(pos!=NULL)
        {
            fname[i] = dlg.GetNextPathName(pos);
            
            name[i] = fname[i].Right(fname[i].GetLength()-fname[i].ReverseFind('\\')-1);
        
            m_ListOutInfo.AddString(name[i]);
        
            i++ ;
        }
    }
}

int t=0 ;
int tt = 0 ;
int TheradsCount = 0;
int j2 = 0;
CWinThread* pThread[MAX_THREADS];
void CDisposeXJXDlg::OnBtnTypeset()
{

    GetDlgItem(IDC_BTN_TYPESET)->EnableWindow(FALSE);


    TheradsCount = m_ListOutInfo.GetCount();

    j2 = TheradsCount ;

    for(int m1=0 ;j2<MAX_THREADS? m1<j2 :m1<MAX_THREADS ;m1++)
    {
         pThread[m1] =AfxBeginThread(CDisposeXJXDlg::ThreadFun,this,THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED);
        
        pThread[m1]->ResumeThread();
    }
}

UINT CDisposeXJXDlg::ThreadFun(LPVOID pParam)
{
    CDisposeXJXDlg* dlg=(CDisposeXJXDlg*)pParam;

    WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
   
    dlg->m_strFbdPath = fname[t];
    dlg->StartDispose(fname[t]);
    t++ ;
    CloseHandle(pThread[tt]);
    tt++ ;

    ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
    CloseHandle(pThread[tt]);
    tt++ ;
    return 0;
}
这是我自己写的,在MFC对话框里添加了一个列表框,打开多个文本然后点击按钮执行OnBtnTypeset()函数,最后想通过创建多个线程,同时调用StartDispose(fname[t])来处理多个文本,求大神们给指点,真心求教....谢谢了!
#12
wp2319572014-03-03 20:42
用一个for 逐个处理不行吗  就是先处理文件1  然后紧跟着处理文件2.。。。。。。。。

多线程也没有想象中那么好处理
#13
南庭2014-03-04 08:04
回复 12楼 wp231957
任务要求啊,没办法,求解,而且你说的逐个处理也没实现,第二次的时候运行到中间就不动了,也不卡死
1