我在做一个数据采集程序,因为数据量比较大,我想把他多存一些文件,以便以后处理.具体想法就是,每采1000000个点换一个文件,我用多线程写了一个,但无法控制线程结束,而且结果好象也不对,请大家帮我看看.
void CDemo2Dlg::OnStart() 
{
    clear_op = FALSE;  //清除标志
    CString m_tempName="PCI9118.dat";
    CWinThread* pThread= AfxBeginThread(CDemo2Dlg::ProcessThread, m_tempName);//开始采集线程
}BOOL clear_op;
int n=1;UINT CDemo2Dlg::ProcessThread(LPVOID lpVOID)
{
  long data_size=5000;//一次传5000笔数据到文件
  long count=0;
  long Totalcount;
  CString num;
  CString m_tempName="PCI9118";
  CString m_FileName=(CString)lpVOID;    
  AI_ContScanChannelsToFile(m_FileName);//每次开始线程都重写文件名.
do {
     //采样程序
      do {
           AI_AsyncDblBufferHalfReady(card, &HalfReady, &fstop);
      } while (!HalfReady);
     AI_AsyncDblBufferTransfer(card, NULL);  //数据传向文件中
     count+=data_size;
  } while (!clear_op||count<1000000);//线程结束标志,已达到1000000个点,结束该线程,开始新的线程.新的线程也用同一个线程函数,只是把文件名改掉.此处就没有思路了.不知道该怎么实现.我发现我的线程无法结束了. 
   m_FileName=m_tempName;
   itoa(n,num);     //文件序号
   n++;  
   m_FileName+=num;
   m_FileName+=".dat"; //下一个文件名为PCI9118n.dat;
   CWinThread* pThread= AfxBeginThread(CDemo2Dlg::ProcessThread, m_FileName);//开始下一个采集线程  
  return 0;
}

解决方案 »

  1.   

    佩服你,线程结束时开线程:)while (clear_op)
    {
    //如果文件〉100000点
    {
      //创建文件
    }//写数据到文件
    }
      

  2.   

    UINT CDemo2Dlg::ProcessThread(LPVOID lpVOID)
    线程函数是由系统呼叫的,是一个CALLBACK函数,不能用C++的this指针,也不能是任何成员函数。它只能是全局函数或C++类的static函数。
    while (!clear_op||count<1000000);
    因此你不能跳出这个循环。
    另外:不需要每次开线程,只需换个文件写。