マルチスレッド †
#!/usr/bin/ruby
require("open3");
cmd= "flac --decode --stdout " +
"\"_inFile_\" | " +
"/home/kosame/src/lame-3.99.5/frontend/lame " +
"-V 5 -b 128 " +
"- " +
"\"_outFile_\"";
maxProcNum = 4;
coreUseFlag = [];
procFileName = [];
myStdIn = [];
myStdOut = [];
myStdErr = [];
myWaitThr = [];
0.upto(maxProcNum-1){|i|
coreUseFlag [i]= false;
procFileName[i]= "";
myStdIn [i]= nil;
myStdOut [i]= nil;
myStdErr [i]= nil;
myWaitThr [i]= nil;
}
files= [];
printf("proc for files: \n");
Dir::glob("*.flac"){|f|
files.push(f);
printf(" %s\n", f);
}
totalFileNum = files.size();
finFileNum = 0;
controllerThreadState= true;
# controller thread ########################################
Thread.fork {
while(true)
# assign one process
cix= coreUseFlag.index(false)
if( cix != nil )
if(files.size() > 0)
# raise proccess
fileName= files.pop();
cmdbuf= cmd.gsub("_inFile_", fileName );
cmdbuf= cmdbuf.sub("_outFile_", fileName.sub(/\.flac$/, ".mp3") );
# printf(":::: command :::: %s\n", cmdbuf);
# printf(":::: run : %s\n", fileName);
myStdIn[cix],
myStdOut[cix],
myStdErr[cix],
myWaitThr[cix] =
*Open3.popen3( cmdbuf );
# check flag
coreUseFlag[cix] = true;
procFileName[cix]= fileName;
else
# printf("no more target file\n");
end
else
# printf("no empty slot.\n");
end
# check wait thread
aliveThread= false;
0.upto(myWaitThr.size()-1){|i|
if(myWaitThr[i] != nil)
aliveThread= true;
begin
# printf("%s\n", myStdOut[i].read_nonblock() );
rescue
# printf("no buf\n");
end
if(myWaitThr[i].alive? == false)
coreUseFlag[i]= false;
finFileNum+= 1;
printf( ">>>> file[%d/%d]: %s \n is done\n",
finFileNum, totalFileNum, procFileName[i]);
myStdOut[i].close();
myStdErr[i].close();
myStdIn[i].close();
myWaitThr[i] = nil;
end
else
# printf("myWaithThr[%d] is empty\n", i)
end
}
# myWaitThr is all nil and
# no more file?
if((aliveThread == false) &
(files.size() == 0))
break;
end
# output stream
sleep(0.2);
end
controllerThreadState= false;
}
# wait for controller thread
while(true)
sleep(0.2);
if(controllerThreadState == false)
break;
end
end