金曜日, 4月 21, 2017

Java: タイムアウト実践編

タイム・アウト実践編です。

終わらない(かもしれない)仕事を時間制限をつけて実行します。

ここはスレッドを用いたクラスを用います。

スレッドを synchronized された関数で呼び出します。

一定時間のち interrupt() を呼び出してスレッドを終了します。

FileTask task=new FileTask(fn);
try {
Thread.sleep(10);
task.interrupt();
if(task.retrieved && task.exists){
// file exists
}else{
// otherwise
}
} catch (InterruptedException e) {
// time out
}

FileTask の定義です。

時間がかかるファイルアクセスをスレッドで実行します。コマンドを走らせて終了時フラグをセットします。

class FileTask extends Thread{
boolean retrieved=false;
boolean exists=false;
String fn="";
FileTask(String fn){
this.fn=fn;
start();
}
public void run(){
try{
File file=new File(fn);
String[] list=file.list();
if(list!=null)
{
exists=true;
}
retrieved=true;
}catch(Exception e){
log.error("File access error",e);
}
}
}
view raw FileTask.java hosted with ❤ by GitHub

これで終わらない仕事は強制終了です。

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...