1

タイトルが示すように、RGtk2 で作成された GUI で関数を非同期で実行できるようにしたいと考えています。

関数自体はシステム コマンドの R ラッパーであるため、処理時間の大部分は system() 呼び出しで使用され、処理時間は 10 分から 1 時間の範囲になります。その期間中も GUI の応答性を維持したいと考えています。

現在、関数は gSignalConnect(GtkButton, 'clicked') に配置されているため、GUI の残りの部分は、'clicked' シグナルが終了するまで応答しません。

これが可能かどうかについて誰か考えがありますか?

最高のトーマス

4

2 に答える 2

3

より直接的な方法があるかもしれませんが、次の方法でこれを行うことができると思いますgTimeoutAdd:

library(RGtk2)

w <- gtkWindow()
g <- gtkVBox(); w$add(g)
b1 <- gtkButton("Start timer"); g$packStart(b1)
b2 <- gtkButton("click me"); g$packStart(b2)


gSignalConnect(b1, "clicked", function(...) {
  id <- gTimeoutAdd(1, function(...) {
    Sys.sleep(5)                        # replace me
    message("Okay, I'm up")
    FALSE                               # one shot
  })
})
gSignalConnect(b2, "clicked", function(...) message('clicked me'))
于 2013-02-15T12:52:23.740 に答える
1

動作する可能性があるのは(テストされていませんが、RGtkにあまり詳しくないため、保証はありません) 、呼び出しでwait=FALSEオプションを使用することです。systemその後、システムコールは非同期で実行されます。次に、gtk GUIで、システムコールが終了したかどうかを定期的に確認する必要があります。RGtkを使用すると、定期的に呼び出される関数を使用できると思います(RGtkのドキュメントから、これはおそらくそうですgtkTimeoutAdd())。

于 2013-02-15T12:50:35.037 に答える