使用多线程和MUTEX锁,从硬盘中读取文件,保存到缓存LIST中。 利用MUTEX锁,防止出现对LIST的读存错误。其他程序可以调用 getData()来从缓存中批量获取数据,提高IO的效率。类似生产者—消费者模式。 //FileData.h #ifndef _FILEDATA_H #define _FILEDATA_H #include <iostream> #include <string> #include <fstream> #include <list> #include <windows.h> #include <process.h> using namespace std; typedef void wthread; typedef void wmutex; #define COUNT 20 class FileData { public: FileData(string fileName); ~FileData(); list<int> getData(); void setFileName(string fileName); string getFileName(); bool start(); bool stop(); static unsigned int WINAPI threadProcess(void * parameter); void lock(){WaitForSingleObject(m_mutex, INFINITE);} void unlock(){ReleaseMutex(m_mutex);} private: FileData(); bool m_bStart; string m_fileName; ifstream m_fileStream; list<int> m_list; wthread* m_thread; wmutex* m_mutex; }; #endif _FILEDATA_H //FileData.cpp #include "FileData.h" FileData::FileData(string fileName) { if (!fileName.empty()) { m_fileName = fileName; } m_bStart = false; } FileData::~FileData() { m_bStart = false; m_fileStream.close(); CloseHandle(m_mutex); CloseHandle(m_thread); m_mutex = NULL; m_thread = NULL; } void FileData::setFileName(string fileName) { if (fileName.empty()) { m_fileName = fileName; } } string FileData::getFileName() { return m_fileName; } bool FileData::start() { if (m_bStart == true) { return true; } m_fileStream.open(m_fileName.c_str()); if(m_fileStream.is_open()) { unsigned int id; m_bStart = true; m_mutex = (wmutex *)CreateMutex(NULL,FALSE,"FILE"); m_thread = (wthread *) _beginthreadex( NULL, 0, FileData::threadProcess, this, 0, (unsigned int *)&id); } else { m_bStart = false; } return m_bStart; } bool FileData::stop() { if (m_bStart == false) { return true; } if (m_thread != NULL && m_mutex != NULL) { m_bStart = false; m_fileStream.close(); CloseHandle(m_mutex); CloseHandle(m_thread); return true; } return false; } unsigned int WINAPI FileData::threadProcess(void * parameter) { FileData* data = (FileData*)parameter; if (data != NULL && data->m_fileStream.is_open()) { int itmp; while (data->m_bStart && data->m_fileStream != NULL) { data->lock(); for (int i=0;i<COUNT*2;i++) { data->m_fileStream>>itmp; data->m_list.push_back(itmp); } data->unlock(); // Sleep(100); } } return TRUE; } list<int> FileData::getData() { list<int> listTmp; if (m_list.empty() == false && m_list.size() > COUNT) { lock(); for (int i=0; i<COUNT;i++) { listTmp.push_back(m_list.front()); m_list.pop_front(); } unlock(); return listTmp; } return listTmp; } //main.cpp #include "FileData.h" void main() { FileData * fileData = new FileData("D://ekg.dat"); fileData->start(); while (true) { list<int> tmp = fileData->getData(); if (!tmp.empty()) { for (list<int>::iterator it = tmp.begin();it!=tmp.end();it++) { cout<<(*it)<<endl; } } } }