新規コンソール

スレッドとコンソールという前回の日記にて、スレッドで複数バッチ処理を起動すると、
コンソールへの出力が混ざってしまって……。
という話をしていましたが、あっさり解決したので、そのことに関して。


単純にコマンド「start」を使う。それだけでした。
startは、新規コンソールにてコマンドを実行するコマンドです。
/wait オプションにて、処理終了まで呼び出し側に処理が戻らないので、それも利用します。

use threads;
use Thread::Queue;

$thread_queue = Thread::Queue->new();

$thread_queue->enqueue(1);
$thread_queue->enqueue(2);
$thread_queue->enqueue(3);
$thread_queue->enqueue(4);


my $thd1 = threads->create(\&proc, "One");
my $thd2 = threads->create(\&proc, "Two");

$thd1->join();
$thd2->join();

sub proc {
  while(0 < $thread_queue->pending) {
    if( my $data = $thread_queue->dequeue ) {
      if( my $pid = fork() ) {
        threads->yield();
        wait();
      }
      else {
        exec 'start "Title" /wait wait.bat 2';
      }
    }
  }
}


こんな感じで、呼びだすといい感じになってくれました。
コマンドを未だにちゃんと把握しきれていないのは勿体無いな、と思いました。
ちゃんと勉強しないとダメですね。