9.3 データ変換処理API(C言語)の使用例

この節では,データ変換処理API(C言語)の使用例を示します。

データ変換処理API(C言語)の使用例には,次の三つの例があります。

<この節の構成>
(1) シングルスレッドの場合
(2) マルチスレッド(スレッド内でMDL情報を生成しない)の場合
(3) マルチスレッド(スレッド内でMDL情報を生成する)の場合

(1) シングルスレッドの場合

 

#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");
     }
   }
 }
}

 

(2) マルチスレッド(スレッド内でMDL情報を生成しない)の場合

 

#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;
}

 

(3) マルチスレッド(スレッド内でMDL情報を生成する)の場合

 

#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;
}