Added.
This commit is contained in:
parent
e8edc7d3de
commit
66eef02948
106
cthread.cpp
106
cthread.cpp
@ -110,42 +110,90 @@ void CThread::Analyse(void){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CThread::DoLine(void){
|
void CThread::DoLine(void){
|
||||||
|
list<pthread_t> threads;
|
||||||
for(auto pcp = line.begin(); pcp != line.end(); pcp++){
|
for(auto pcp = line.begin(); pcp != line.end(); pcp++){
|
||||||
string name = (*pcp)->name;
|
string name = (*pcp)->name;
|
||||||
|
|
||||||
vector<void *> args = rargs.find(name)->second;
|
vector<void *> args = rargs.find(name)->second;
|
||||||
vector<void *> &args_out = rargs_out.find(name)->second;
|
|
||||||
vector<int> fargs = (*pcp)->fargs_in;
|
vector<int> fargs = (*pcp)->fargs_in;
|
||||||
vector<int> fargs_out = (*pcp)->fargs_out;
|
vector<int> fargs_out = (*pcp)->fargs_out;
|
||||||
vector<void *> &argso = (*pcp)->args_out;
|
|
||||||
// 清空调用数据
|
threads.push_back({0});
|
||||||
(*pcp)->Clear();
|
// 创建新线程
|
||||||
int cout = 0;
|
struct thread_args *pt_ta = new struct thread_args({this,(*pcp),-1});
|
||||||
// 传入输入参数
|
if(pthread_create(&threads.back(),NULL,&CThread::NewThread,(void *)(pt_ta))){
|
||||||
for(auto arg = args.begin(); arg != args.end(); arg++,cout++){
|
throw "fail to create thread";
|
||||||
if(fargs[cout] == INT){
|
|
||||||
(*pcp)->addArgsIn<int>(*((int *)(*arg)));
|
|
||||||
}
|
|
||||||
else if(fargs[cout] == DOUBLE){
|
|
||||||
(*pcp)->addArgsIn<double>(*((double *)(*arg)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 调用计算模块
|
|
||||||
if(!(*pcp)->Run()){
|
|
||||||
ifsolved.find(name)->second = true;
|
|
||||||
int cout = 0;
|
|
||||||
// 处理输出
|
|
||||||
for(auto argo = argso.begin(); argo != argso.end(); argo++,cout++){
|
|
||||||
if(fargs_out[cout] == INT){
|
|
||||||
int *p_value = new int(*((int *)(*argo)));
|
|
||||||
args_out.push_back((void *)p_value);
|
|
||||||
}
|
|
||||||
else if(fargs_out[cout] == DOUBLE){
|
|
||||||
double *p_value = new double(*((double *)(*argo)));
|
|
||||||
args_out.push_back((double *)p_value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
line.clear();
|
line.clear();
|
||||||
|
// 等待线程返回
|
||||||
|
for(auto i = threads.begin(); i != threads.end(); i++){
|
||||||
|
struct thread_args *rpv = nullptr;
|
||||||
|
pthread_join((*i), (void **)&rpv);
|
||||||
|
// 根据返回值处理计算任务状态
|
||||||
|
if(rpv->rtn == SUCCESS){
|
||||||
|
ifsolved.find(rpv->pcp->name)->second = true;
|
||||||
|
}
|
||||||
|
delete rpv;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void *CThread::NewThread(void *pv){
|
||||||
|
struct thread_args *pta = (struct thread_args *)pv;
|
||||||
|
printf("Calling CPART %s.\n",pta->pcp->name.data());
|
||||||
|
// 准备输入参数
|
||||||
|
PrepareArgsIn(pta->pct,pta->pcp);
|
||||||
|
if(pta->pcp->Run() == SUCCESS){
|
||||||
|
// 处理输出参数
|
||||||
|
GetArgsOut(pta->pct,pta->pcp);
|
||||||
|
pta->rtn = SUCCESS;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
pta->rtn = FAIL;
|
||||||
|
}
|
||||||
|
printf("Called CPART %s.\n",pta->pcp->name.data());
|
||||||
|
pthread_exit(pv);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CThread::PrepareArgsIn(CThread *pct,CPart *pcp){
|
||||||
|
// 读入实际计算进程参数列表中的输入参数
|
||||||
|
vector<void *> args = pct->rargs.find(pcp->name)->second;
|
||||||
|
// 获得输入参数格式
|
||||||
|
vector<int> fargs = pcp->fargs_in;
|
||||||
|
// 清空历史数据
|
||||||
|
pcp->Clear();
|
||||||
|
// 传入输入参数
|
||||||
|
int cout = 0;
|
||||||
|
for(auto arg = args.begin(); arg != args.end(); arg++,cout++){
|
||||||
|
if(fargs[cout] == INT){
|
||||||
|
pcp->addArgsIn<int>(*((int *)(*arg)));
|
||||||
|
}
|
||||||
|
else if(fargs[cout] == DOUBLE){
|
||||||
|
pcp->addArgsIn<double>(*((double *)(*arg)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CThread::GetArgsOut(CThread *pct,CPart *pcp){
|
||||||
|
// 获得输出参数格式
|
||||||
|
vector<int> fargs_out = pcp->fargs_out;
|
||||||
|
// 获得计算模块中的输出参数列表
|
||||||
|
vector<void *> &argso = pcp->args_out;
|
||||||
|
// 获得实际计算进程输出参数储存列表
|
||||||
|
vector<void *> &args_out = pct->rargs_out.find(pcp->name)->second;
|
||||||
|
|
||||||
|
// 处理输出
|
||||||
|
int cout = 0;
|
||||||
|
for(auto argo = argso.begin(); argo != argso.end(); argo++,cout++){
|
||||||
|
if(fargs_out[cout] == INT){
|
||||||
|
int *p_value = new int(*((int *)(*argo)));
|
||||||
|
args_out.push_back((void *)p_value);
|
||||||
|
}
|
||||||
|
else if(fargs_out[cout] == DOUBLE){
|
||||||
|
double *p_value = new double(*((double *)(*argo)));
|
||||||
|
args_out.push_back((double *)p_value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
13
cthread.h
13
cthread.h
@ -12,6 +12,7 @@
|
|||||||
#include "cpart.h"
|
#include "cpart.h"
|
||||||
#include "cmap.h"
|
#include "cmap.h"
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
using std::list;
|
using std::list;
|
||||||
@ -44,6 +45,18 @@ public:
|
|||||||
void Analyse(void);
|
void Analyse(void);
|
||||||
// 执行处理队列
|
// 执行处理队列
|
||||||
void DoLine(void);
|
void DoLine(void);
|
||||||
|
// 建立新线程执行计算模块
|
||||||
|
static void * NewThread(void *);
|
||||||
|
// 为计算模块的调用准备输入参数
|
||||||
|
static void PrepareArgsIn(CThread *pct,CPart *);
|
||||||
|
// 获得计算模块执行后的输出参数
|
||||||
|
static void GetArgsOut(CThread *pct,CPart *);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct thread_args{
|
||||||
|
CThread *pct;
|
||||||
|
CPart *pcp;
|
||||||
|
int rtn;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* cthread_h */
|
#endif /* cthread_h */
|
||||||
|
Loading…
Reference in New Issue
Block a user