複数ユーザの秒読み時計
秒読み時計を表示するチャネルと,秒読みを行う関数を定義する.
In[1]:=
![Click for copyable input](assets.ja/multi-user-countdown-clock/In_72.png)
CreateChannel["Countdown",
HandlerFunctions ->
Association["MessageReceived" -> ((Countdown`$time = #Message) &)],
Initialization :>
CreateWindow[
DocumentNotebook[{Dynamic[
ClockGauge[$time, PlotTheme -> "Business"]]}],
WindowSize -> All, WindowElements -> {}, ShowCellBracket -> False,
Background -> Black, WindowFrameElements -> {"CloseBox"},
Selectable -> False, WindowTitle -> "Countdown",
CellContext -> "Countdown`"],
Permissions ->
Association["All" -> "Read", "Owner" -> {"Write", "Execute"}]]
Out[1]=
![](assets.ja/multi-user-countdown-clock/O_70.png)
In[2]:=
![Click for copyable input](assets.ja/multi-user-countdown-clock/In_73.png)
countdown[t_] :=
DynamicModule[{paused = True, lbl = "Pause", ii = t, up = None},
Row[{Button[Dynamic[If[paused, "Start", lbl]], paused = ! paused;
up = If[paused, None, UpdateInterval -> 1]],
Dynamic[Refresh[
If[ii >= 0 && ! paused,
" \[LongRightArrow] " <>
TextString[ChannelSend["Countdown", ii--]],
If[ii <= 0, up = None; lbl = "Done"]; ""], up,
TrackedSymbols :> {paused}]]}]]
チャネルを購読する.
In[3]:=
![Click for copyable input](assets.ja/multi-user-countdown-clock/In_74.png)
listener = ChannelListen["Countdown"]
Out[3]=
![](assets.ja/multi-user-countdown-clock/O_71.png)
ある一定秒数間の秒読みを設定し,ボタンをクリックして開始する.
In[4]:=
![Click for copyable input](assets.ja/multi-user-countdown-clock/In_75.png)
countdown[20]
Out[4]=
![](assets.ja/multi-user-countdown-clock/O_72.png)
時計は,途中で停止されない限り,秒読みが実行されている間更新される.
Out[5]=
![](assets.ja/multi-user-countdown-clock/O_73.png)
ChannelListenでこのチャネルを参照することにより,他のユーザがこの秒読み時計を購読することができる.
In[6]:=
![Click for copyable input](assets.ja/multi-user-countdown-clock/In_76.png)
$WolframID <> ":Countdown"
Out[6]=
![](assets.ja/multi-user-countdown-clock/O_74.png)
In[7]:=
![Click for copyable input](assets.ja/multi-user-countdown-clock/In_77.png)
$WolframID <> ":Countdown";
ChannelListen[%]
Out[7]=
![](assets.ja/multi-user-countdown-clock/O_75.png)