我在做一个数据采集程序,因为数据量比较大,我想把他多存一些文件,以便以后处理.具体想法就是,每采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;
}
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;
}
{
//如果文件〉100000点
{
//创建文件
}//写数据到文件
}
线程函数是由系统呼叫的,是一个CALLBACK函数,不能用C++的this指针,也不能是任何成员函数。它只能是全局函数或C++类的static函数。
while (!clear_op||count<1000000);
因此你不能跳出这个循环。
另外:不需要每次开线程,只需换个文件写。