uCosminexus Interschema ユーザーズガイド

[目次][用語][索引][前へ][次へ]

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