ページ 11

beginthreadexについて

Posted: 2011年10月27日(木) 11:06
by okusueki
以下のプログラム(juliusのsimpleのmain文)ですが、そこのmain関数の中にあるものをbeginthreadexを用いてスレッド化し、mainではそのスレッドを呼び出せば使えるようにしたいのですが、beginthreadexを使ったことがなく、様々なサイトを見ていますが、いまいち理解できません。このプログラムでbeginthreadexを用いてスレッド化する、やり方、ポイントなど教えていただけたらと思います。最終的には、このスレッドと別のプログラムを一緒に動かします。
また、beginthreadexを理解するために分かりやすいサイト等ございましたら教えていただきたいです。

コード:

int main(int argc, char *argv[])
{

  Jconf *jconf;

  Recog *recog;

  static char speechfilename[MAXPATHLEN];

  int ret;

  if (argc == 1) {
    fprintf(stderr, "Julius rev.%s - based on ", JULIUS_VERSION);
    j_put_version(stderr);
    fprintf(stderr, "Try '-setting' for built-in engine configuration.\n");
    fprintf(stderr, "Try '-help' for run time options.\n");
    return -1;
  }

  jconf = j_config_load_args_new(argc, argv);
  if (jconf == NULL) {		/* error */
    fprintf(stderr, "Try `-help' for more information.\n");
    return -1;
  }
  
  recog = j_create_instance_from_jconf(jconf);
  if (recog == NULL) {
    fprintf(stderr, "Error in startup\n");
    return -1;
  }

  callback_add(recog, CALLBACK_EVENT_SPEECH_READY, status_recready, NULL);
  callback_add(recog, CALLBACK_EVENT_SPEECH_START, status_recstart, NULL);
  callback_add(recog, CALLBACK_RESULT, output_result, NULL);

  if (j_adin_init(recog) == FALSE) {    /* error */
    return -1;
  }

  j_recog_info(recog);


  if (jconf->input.speech_input == SP_MFCFILE) {
    /* MFCC file input */

    while (get_line_from_stdin(speechfilename, MAXPATHLEN, "enter MFCC filename->") != NULL) {
      if (verbose_flag) printf("\ninput MFCC file: %s\n", speechfilename);
      /* open the input file */
      ret = j_open_stream(recog, speechfilename);
      switch(ret) {
      case 0:			/* succeeded */
	break;
      case -1:      		/* error */
	/* go on to the next input */
	continue;
      case -2:			/* end of recognition */
	return;
      }
      /* recognition loop */
      ret = j_recognize_stream(recog);
      if (ret == -1) return -1;	/* error */
      /* reach here when an input ends */
    }

  } else {
    /* raw speech input (microphone etc.) */

    switch(j_open_stream(recog, NULL)) {
    case 0:			/* succeeded */
      break;
    case -1:      		/* error */
      fprintf(stderr, "error in input stream\n");
      return;
    case -2:			/* end of recognition process */
      fprintf(stderr, "failed to begin input stream\n");
      return;
    }
    
    ret = j_recognize_stream(recog);
    if (ret == -1) return -1;	/* error */
    
  }

  j_close_stream(recog);

  j_recog_free(recog);

  return(0);
}

Re: beginthreadexについて

Posted: 2011年10月27日(木) 11:40
by softya(ソフト屋)
スレッド分けする場合には、まずその部分を関数に分けてください。
・スレッド化する関数は処理が終了しても無限ループで常に待機するようにします。
・CPU使用率100%でスレッドが処理しないようにSleepなどを入れる必要があります。
・メイン側と通信する方法を検討する必要があります。ミューテックス、イベント、クリティカルセクションなどなど

分かりやすそうなサイト。
「マルチスレッド大好き」
http://www.geocities.jp/debu0510/personal/kusosure.html
「マルチスレッドプログラミング」
http://onishi-lab.jp/programming/thread_win.html

これでも説明になっていないので、やりたいことをまとめてみて下さい。