2 u013913207 u013913207 于 2014.03.04 20:54 提问

MFC循环创建多线程同时处调用同一函数读写文本和excel操作

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,"(*.tmp) | *.tmp||",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;
int j3 = 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]);


delete  []dlg ;
Sleep(100) ;
 t++ ;



ReleaseSemaphore(semaphoreWrite.m_hObject,1,NULL);
return 0 ;

}
这是我自己写的,在MFC对话框里添加了一个列表框,打开多个文本然后点击按钮执行OnBtnTypeset()函数,最后想通过创建多个线程,同时调用StartDispose(fname[t])来处理多个文本和处理EXCEL,做了几天了出来的结果就是线程只能按队列执行,文本读取或EXCEl处理一两个对话框就结束了或者内存泄露,完全达不到任务要求, 求大神们给指点,真心求教....谢谢了!

1个回答

u013913207
u013913207   2014.03.10 19:23

经过多次的反复试验证明以上程序有效,失败的原因在于文件本身内容不符合程序的某些处理需求导致的,对于多线程按队列处理同一资源还是有很大帮助

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!