标题:求教指点MFC多线程调用同一函数并行处理的问题
只看楼主
南庭
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2011-5-9
结帖率:66.67%
已结贴  问题点数:15 回复次数:2 
求教指点MFC多线程调用同一函数并行处理的问题
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])来处理多个文本,求大神们给指点,真心求教....谢谢了!
搜索更多相关主题的帖子: control 多线程 
2014-03-03 20:41
yuccn
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:何方
等 级:版主
威 望:167
帖 子:6809
专家分:42393
注 册:2010-12-16
得分:11 
问题是什么?

为什么tt 在不断的++?而且在线程函数调用两次closehandle?注意啊,++ 之后,他关闭了两个线程的handle了。

而且,你在处理认为时候,已经上锁了,也就是说线程函数内部是异步处理的,没有很好的做到多线程

合理的应该这样,
ThreadFun


上锁
去资源
解锁

处理任务


因为你要上锁的是公共资源,而不是处理的行为

我行我乐
我的博客:
http://blog.yuccn. net
2014-03-04 12:11
南庭
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2011-5-9
得分:0 
回复 2楼 yuccn
抱歉tt++和closehandle开始两个忘了注释了,但是后面的内容还是不太明白,就是怎么把公共资源与任务分开,我下面写了两种结果都是第二次调用线程的时候内存溢出或不动了,因为StartDispose函数还调用了几个函数处理完txt还处理。doc就不知道怎么释放内存
一、
CString strPath1 = "" ;
UINT CDisposeXJXDlg::ThreadFun(LPVOID pParam)
{
    CDisposeXJXDlg* dlg=(CDisposeXJXDlg*)pParam;

    WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);
   
    dlg->m_strFbdPath = fname[t];

    strPath1 = fname[t] ;

    t++ ;
    dlg->StartDispose(strPath1);
   
   
;
    ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
    CloseHandle(pThread[tt]);
    tt++ ;

    return 0 ;
   
}
二、
UINT CDisposeXJXDlg::ThreadFun(LPVOID pParam)
{
CDisposeXJXDlg* dlg=(CDisposeXJXDlg*)pParam;
for(; tt<j2 ; tt++,t++)
    {   
        WaitForSingleObject(semaphoreWrite.m_hObject,INFINITE);

        dlg->m_strFbdPath = fname[t] ;

        dlg->StartDispose(fname[t])  ;

//        CloseHandle(pThread[tt]);
        
        ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
    }
return 0;
}
2014-03-04 14:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-427959-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.253462 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved