C++多线程实现电子词典
生活随笔
收集整理的這篇文章主要介紹了
C++多线程实现电子词典
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
// Dictionary.cpp : 定義控制臺(tái)應(yīng)用程序的入口點(diǎn)。
//vs2013編譯
//字典文件:https://pan.baidu.com/s/1YHtwptaq_V8j034U9_J96A
#include "stdafx.h"
#include <string>
#include <vector>
#include <iostream>
#include <map>
#include <fstream>
#include <io.h>
#include <thread>
#include <time.h>
#include <Windows.h>
using namespace std;class ParseDirectory
{
public:ParseDirectory(string path){this->path = path;getFiles(files);isdone = false;t = thread(&ParseDirectory::txtToDic, this);//t.join();}bool isDone(){return isdone;}map<string, string> getDic(){return vecDics;}virtual ~ParseDirectory(){}private:vector<string> files;string path;thread t;map<string, string> vecDics;bool isdone;void getFiles(vector<string>& files){//文件句柄long hFile = 0;//文件信息struct _finddata_t fileinfo;string p;if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1){do{//如果是目錄,迭代之if ((fileinfo.attrib & _A_SUBDIR)){//if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)//getFiles(p.assign(path).append("\\").append(fileinfo.name), files);continue;}else{files.push_back(p.assign(path).append("\\").append(fileinfo.name));}} while (_findnext(hFile, &fileinfo) == 0);_findclose(hFile);}}void txtToDic(){for each (string file in files){fstream f(file);string word, explain;//map<string, string> dic;if (f.is_open()){//cout << file << endl;while (1){getline(f, word);if (!getline(f, explain))break;vecDics[word] = explain;}}f.close();//vecDics.push_back(dic);}//cout << vecDics.size() << endl;isdone = true;}
};
void setColor(unsigned short ForeColor = 2, unsigned short BackGroundColor = 0){HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);//獲取當(dāng)前窗口句柄SetConsoleTextAttribute(handle, ForeColor + BackGroundColor * 0x10);//設(shè)置顏色}
int _tmain(int argc, _TCHAR* argv[])
{vector<ParseDirectory*> pds;cout << "正在加載資源...";long start = clock();vector<map<string, string> > allWords;for (int i = 0; i < 26; i++){string name = ".\\";name += 'A' + i;pds.push_back(new ParseDirectory(name));}int cnt = 0;for (int i = 0; i < pds.size(); i++){if (pds[i]->isDone()){cnt++;allWords.push_back(pds[i]->getDic());Sleep(300);}if (cnt == pds.size())break;}system("cls");cout << "加載完成!" << "耗時(shí):" << (clock()-start)/1000.0 << "s" << endl;cout << allWords.size();string inquir;while (1){bool flag = false;setColor();cout << "\n輸入要查詢的單詞:";setColor(7, 0);cin >> inquir;for (int i = 0; i < allWords.size(); i++){auto t = allWords[i][inquir];if (t.size()){cout << t << endl;flag=true;}}if (!flag){setColor(4, 0);cout << "抱歉,未找到單詞" << endl;}}system("pause");return 0;
}
總結(jié)
以上是生活随笔為你收集整理的C++多线程实现电子词典的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ubuntu第一次设置root密码
- 下一篇: 无源码修改exe文件图标