uCosminexus Interschema ユーザーズガイド
この節では,データ変換処理API(C言語)の使用例を示します。
データ変換処理API(C言語)の使用例には,次の三つの例があります。
#include <stdio.h> #include "ETtrans.h" static void print_message(int iCode, char *msg, ETTRANSERRLIST *ErrList); int main() { int iRet = 0; ETTRANSADRSLIST AdrsList[3]; ETTRANSERRLIST ErrList; char *pTC = NULL; char *pMI = NULL; /* アドレスリストの設定 */ AdrsList[0].FormatName = "IN"; AdrsList[0].DataKind = ET_DK_FILE; AdrsList[0].DataAddress = "input.txt"; AdrsList[1].FormatName = "OUT"; AdrsList[1].DataKind = ET_DK_FILE; AdrsList[1].DataAddress = "output.txt"; AdrsList[2].FormatName = NULL; /* トランスレータ初期化 */ iRet = ETtrans2Init(NULL); if (iRet) { print_message(iRet, "ETtrans2Init", NULL); goto EXIT; } /* スレッド固有情報生成 */ iRet = ETtrans2CreateThreadContext( &pTC, ET_LG_ON,NULL, ET_FA_UPDATE, ET_OP_FNOFF, "-IERR"); if (iRet) { print_message(iRet, "ETtrans2CreateThreadContext", NULL); goto END; } /* MDLローディング */ iRet = ETtrans2CreateMdlInfo(&pMI, "SAMPLE.mdl", NULL); if (iRet) { print_message(iRet, "ETtrans2CreateMdlInfo", NULL); goto END; } /* 変換実行 */ iRet = ETtrans2Exec(pTC, pMI, AdrsList, &ErrList, NULL); if (iRet) { print_message(iRet, "ETtrans2Exec", &ErrList); goto END; } END: if (pMI) { /* MDLアンロード */ iRet = ETtrans2ReleaseMdlInfo(pMI); if (iRet) { print_message(iRet, "ETtrans2ReleaseMdlInfo", NULL); } } if (pTC) { /* スレッド固有情報解放 */ iRet = ETtrans2ReleaseThreadContext(pTC); if (iRet) { print_message(iRet, "ETtrans2ReleaseThreadContext", NULL); } } /* 終了処理 */ iRet = ETtrans2End(); if (iRet) { print_message(iRet, "ETtrans2End", NULL); } EXIT: printf("--> Return Code = 0x%08x\n", iRet); return iRet; } /* * エラー情報出力関数 */ static void print_message(int iCode, char *msg, ETTRANSERRLIST *ErrList) { int i; ETTRANSERRDATA *edata; printf("### ERROR %s %d ###\n", msg, iCode); if (ErrList) { printf(" Error Size = %d\n", ErrList->Size); for (i = 0; i < ErrList->Size; i++) { edata = &ErrList->ErrData[i]; printf("\t%02d (0x%08x) num=%d", edata->MessageNo, edata->ErrorLevel, edata->NumericData); if (edata->Information) { printf(" info=%s\n", edata->Information); } else { printf("\n"); } } } }
#include <stdio.h> #include <string.h> #ifdef WIN32 #include <process.h> #include <windows.h> #else #include <pthread.h> #endif #include "ETtrans.h" #define THRD_NUM 3 /* スレッドの数 */ /* スレッドに渡す情報を格納する構造体 */ typedef struct _THD_INF { char *pMI; /* MDL情報 */ char *pTC; /* スレッド固有情報 */ char InputDataFile[256]; /* 入力データファイル名 */ char OutputDataFile[256]; /* 出力データファイル名 */ int iTid; /* スレッド番号 */ } THD_INF; #ifdef WIN32 DWORD WINAPI ettrans_thrd(LPVOID); #else void *ettrans_thrd(void*); #endif /* * main : メイン関数 */ int main() { int iRet = 0; int i; char *pMI = NULL; char *pTC_Ary[THRD_NUM]; THD_INF thd_inf_Ary[THRD_NUM]; char numwk[12]; #ifdef WIN32 DWORD thrdid[THRD_NUM]; HANDLE hthrd[THRD_NUM]; #else int ret_thread; pthread_t hthrd[THRD_NUM]; #endif for (i = 0 ; i < THRD_NUM; i++) { pTC_Ary[i] = NULL; } /* トランスレータ初期化 */ iRet = ETtrans2Init(NULL); if (iRet) goto EXIT; /* MDLローディング */ iRet = ETtrans2CreateMdlInfo(&pMI, "SAMPLE.mdl", NULL); if (iRet) goto END; /* スレッド固有情報生成 */ for (i = 0 ; i < THRD_NUM; i++) { iRet = ETtrans2CreateThreadContext(&pTC_Ary[i], ET_LG_ON, NULL, ET_FA_UPDATE, ET_OP_FNOFF, "-IERR"); if (iRet) goto END; } /* スレッド生成 & 変換実行 */ for (i = 0 ; i < THRD_NUM; i++) { sprintf(numwk, "%d", i + 1); strcpy(thd_inf_Ary[i].InputDataFile, "input"); strcat(thd_inf_Ary[i].InputDataFile, numwk); strcat(thd_inf_Ary[i].InputDataFile, ".txt"); strcpy(thd_inf_Ary[i].OutputDataFile, "output"); strcat(thd_inf_Ary[i].OutputDataFile, numwk); strcat(thd_inf_Ary[i].OutputDataFile, ".txt"); thd_inf_Ary[i].iTid = i + 1; thd_inf_Ary[i].pMI = pMI; thd_inf_Ary[i].pTC = pTC_Ary[i]; #ifdef WIN32 hthrd[i] = CreateThread(NULL, 0, ettrans_thrd, (LPVOID)&thd_inf_Ary[i], 0, &thrdid[i]); #else ret_thread = pthread_create(&hthrd[i], NULL, ettrans_thrd, &thd_inf_Ary[i]); #endif } /* スレッド終了待合せ */ #ifdef WIN32 for (i = 0; i < THRD_NUM; i++) { WaitForSingleObject(hthrd[i], INFINITE); } for ( i = 0 ; i < THRD_NUM; i++ ){ CloseHandle(hthrd[i]); } #else for ( i = 0 ; i < THRD_NUM; i++ ){ pthread_join(hthrd[i], NULL); } #endif END: if (pMI) { /* MDLアンロード */ ETtrans2ReleaseMdlInfo(pMI); } for (i = 0 ; i < THRD_NUM; i++) { if (pTC_Ary[i]) { /* スレッド固有情報解放 */ ETtrans2ReleaseThreadContext(pTC_Ary[i]); } } /* 終了処理 */ ETtrans2End(); EXIT: printf("*** END - 0x%08x ***\n", iRet); return(iRet); } /* * ettrans_thrd : スレッド対応関数 */ #ifdef WIN32 DWORD WINAPI ettrans_thrd(LPVOID Inf_Arg) #else void *ettrans_thrd(void *Inf_Arg) #endif { int iRet = 0; int iTid = 0; THD_INF thd_inf; ETTRANSADRSLIST AdrsList[3]; ETTRANSERRLIST ErrList; thd_inf = *(THD_INF*)Inf_Arg; iTid = thd_inf.iTid; /* 引数の設定 */ AdrsList[0].FormatName = "IN"; AdrsList[0].DataKind = ET_DK_FILE; AdrsList[0].DataAddress = thd_inf.InputDataFile; AdrsList[1].FormatName = "OUT"; AdrsList[1].DataKind = ET_DK_FILE; AdrsList[1].DataAddress = thd_inf.OutputDataFile; AdrsList[2].FormatName = NULL; /* 変換実行 */ iRet = ETtrans2Exec(thd_inf.pTC, thd_inf.pMI, AdrsList, &ErrList, NULL); printf("Thread %08d End - Return Code 0x%08x\n", iTid, iRet); #ifdef WIN32 ExitThread(0); #else pthread_exit((void *)0); #endif return 0; }
#include <stdio.h> #include <string.h> #ifdef WIN32 #include <process.h> #include <windows.h> #else #include <pthread.h> #endif #include "ETtrans.h" #define THRD_NUM 3 /* スレッドの数 */ /* スレッドに渡す情報を格納する構造体 */ typedef struct _THD_INF { char *pTC; /* スレッド固有情報 */ char InputDataFile[256]; /* 入力データファイル名 */ char OutputDataFile[256]; /* 出力データファイル名 */ int iTid; /* スレッド番号 */ } THD_INF; #ifdef WIN32 DWORD WINAPI ettrans_thrd(LPVOID); #else void *ettrans_thrd(void*); #endif /* * main : メイン関数 */ int main() { int iRet = 0; int i; char *pTC_Ary[THRD_NUM]; THD_INF thd_inf_Ary[THRD_NUM]; char numwk[12]; #ifdef WIN32 DWORD thrdid[THRD_NUM]; HANDLE hthrd[THRD_NUM]; #else int ret_thread; pthread_t hthrd[THRD_NUM]; #endif for (i = 0 ; i < THRD_NUM; i++) { pTC_Ary[i] = NULL; } /* トランスレータ初期化 */ iRet = ETtrans2Init(NULL); if (iRet) goto EXIT; /* スレッド固有情報生成 */ for (i = 0 ; i < THRD_NUM; i++) { iRet = ETtrans2CreateThreadContext(&pTC_Ary[i], ET_LG_ON, NULL, ET_FA_UPDATE, ET_OP_FNOFF, "-IERR"); if (iRet) goto END; } /* スレッド生成 & 変換実行 */ for (i = 0 ; i < THRD_NUM; i++) { sprintf(numwk, "%d", i + 1); strcpy(thd_inf_Ary[i].InputDataFile, "input"); strcat(thd_inf_Ary[i].InputDataFile, numwk); strcat(thd_inf_Ary[i].InputDataFile, ".txt"); strcpy(thd_inf_Ary[i].OutputDataFile, "output"); strcat(thd_inf_Ary[i].OutputDataFile, numwk); strcat(thd_inf_Ary[i].OutputDataFile, ".txt"); thd_inf_Ary[i].iTid = i + 1; thd_inf_Ary[i].pTC = pTC_Ary[i]; #ifdef WIN32 hthrd[i] = CreateThread(NULL, 0, ettrans_thrd, (LPVOID)&thd_inf_Ary[i], 0, &thrdid[i]); #else ret_thread = pthread_create(&hthrd[i], NULL, ettrans_thrd, &thd_inf_Ary[i]); #endif } /* スレッド終了待合せ */ #ifdef WIN32 for (i = 0; i < THRD_NUM; i++) { WaitForSingleObject(hthrd[i], INFINITE); } for ( i = 0 ; i < THRD_NUM; i++ ){ CloseHandle(hthrd[i]); } #else for ( i = 0 ; i < THRD_NUM; i++ ){ pthread_join(hthrd[i], NULL); } #endif END: for (i = 0 ; i < THRD_NUM; i++) { if (pTC_Ary[i]) { /* スレッド固有情報解放 */ ETtrans2ReleaseThreadContext(pTC_Ary[i]); } } /* 終了処理 */ ETtrans2End(); EXIT: printf("*** END - 0x%08x ***\n", iRet); return(iRet); } /* * ettrans_thrd : スレッド対応関数 */ #ifdef WIN32 DWORD WINAPI ettrans_thrd(LPVOID Inf_Arg) #else void *ettrans_thrd(void *Inf_Arg) #endif { int iRet = 0; int iTid = 0; char *pMI = NULL; THD_INF thd_inf; ETTRANSADRSLIST AdrsList[3]; ETTRANSERRLIST ErrList; thd_inf = *(THD_INF*)Inf_Arg; iTid = thd_inf.iTid; /* 引数の設定 */ AdrsList[0].FormatName = "IN"; AdrsList[0].DataKind = ET_DK_FILE; AdrsList[0].DataAddress = thd_inf.InputDataFile; AdrsList[1].FormatName = "OUT"; AdrsList[1].DataKind = ET_DK_FILE; AdrsList[1].DataAddress = thd_inf.OutputDataFile; AdrsList[2].FormatName = NULL; /* MDLローディング */ iRet = ETtrans2CreateMdlInfo(&pMI, "SAMPLE.mdl", NULL); if (iRet) goto END; /* 変換実行 */ iRet = ETtrans2Exec(thd_inf.pTC, pMI, AdrsList, &ErrList, NULL); END: if (pMI) { /* MDLアンロード */ ETtrans2ReleaseMdlInfo(pMI); } printf("Thread %08d End - Return Code 0x%08x\n", iTid, iRet); #ifdef WIN32 ExitThread(0); #else pthread_exit((void *)0); #endif return 0; }
All Rights Reserved, Copyright (C) 2000, Information-technology Promotion Agency, Japan.
All Rights Reserved. Copyright (C) 2005, 2008, Hitachi, Ltd.
All Rights Reserved, Copyright (C) 1985-1998, Microsoft Corporation.