質問編集履歴

2

timer.intervalを使った実装方法を再度質問

2020/05/13 11:21

投稿

senkei_river
senkei_river

スコア15

test CHANGED
File without changes
test CHANGED
@@ -144,8 +144,128 @@
144
144
 
145
145
  ### 処理の流れ
146
146
 
147
- send関数実行[1秒]→send関数実行→[1秒]→send関数実行→[3秒]→send関数実行→[1秒]→・・・
147
+ func関数実行[1秒]→func関数実行→[1秒]→func関数実行→[3秒]→func関数実行→[1秒]→・・・
148
-
149
-
150
-
148
+
149
+
150
+
151
- send関数実行→[1秒]」が一つの処理の単位で、これがn回終われば3秒待つというような処理を書こうとしています。
151
+ func関数実行→[1秒]」が一つの処理の単位で、これがn回終われば3秒待つというような処理の流れです。
152
+
153
+
154
+
155
+ 上記を実現するのに、以下ソースコードを書きました。ここで改めて質問させていただきたいのですが、timerのintervalプロパティを変更する、というのは適切なのでしょうか(intervalプロパティを変更し、待ち時間を変更させるというのは使い方が違う気がしてます)。
156
+
157
+ また、GUI上に配置するボタン押下で繰り返し実行処理を終了させたく、Zuishin様から頂いたTask.Delay()関数を使ったwhile文ループでは一度forループに入ると3回分の処理が実行されてしまうと思っており、途中で処理を終了させるようにもしたいです。
158
+
159
+
160
+
161
+ ```
162
+
163
+ using System;
164
+
165
+ using System.Windows;
166
+
167
+ using System.Windows.Threading;
168
+
169
+
170
+
171
+ namespace timerSamplePrj
172
+
173
+ {
174
+
175
+ /// <summary>
176
+
177
+ /// MainWindow.xaml の相互作用ロジック
178
+
179
+ /// </summary>
180
+
181
+ public partial class MainWindow : Window
182
+
183
+ {
184
+
185
+ DispatcherTimer timer= new DispatcherTimer();
186
+
187
+
188
+
189
+ string[] files = { "a", "b", "c" };
190
+
191
+ int fileIter = 0;
192
+
193
+
194
+
195
+ public MainWindow()
196
+
197
+ {
198
+
199
+ InitializeComponent();
200
+
201
+ timer.Interval = TimeSpan.FromMilliseconds(0);
202
+
203
+ timer.Tick += func;
204
+
205
+ }
206
+
207
+
208
+
209
+ private void func(object sender, EventArgs e)
210
+
211
+ {
212
+
213
+ Console.WriteLine("func関数で" + files[fileIter++] + "を実行中");
214
+
215
+
216
+
217
+ if (fileIter == files.Length)
218
+
219
+ {
220
+
221
+ fileIter = 0;
222
+
223
+ timer.Interval = TimeSpan.FromMilliseconds(3000);
224
+
225
+ }
226
+
227
+ else
228
+
229
+ {
230
+
231
+ timer.Interval = TimeSpan.FromMilliseconds(1000);
232
+
233
+ }
234
+
235
+ }
236
+
237
+
238
+
239
+ private void button_Click(object sender, RoutedEventArgs e)
240
+
241
+ {
242
+
243
+ Console.WriteLine("exec開始");
244
+
245
+ timer.Start();
246
+
247
+ }
248
+
249
+
250
+
251
+ private void button1_Click(object sender, RoutedEventArgs e)
252
+
253
+ {
254
+
255
+ Console.WriteLine("exec終了");
256
+
257
+ fileIter = 0;
258
+
259
+
260
+
261
+ timer.Stop();
262
+
263
+ timer.Interval = TimeSpan.FromMilliseconds(0);
264
+
265
+ }
266
+
267
+ }
268
+
269
+ }
270
+
271
+ ```

1

処理の流れについて補足いたしました

2020/05/13 11:21

投稿

senkei_river
senkei_river

スコア15

test CHANGED
File without changes
test CHANGED
@@ -134,6 +134,18 @@
134
134
 
135
135
  }
136
136
 
137
+ ```
137
138
 
138
139
 
140
+
139
- ```
141
+ [補足]
142
+
143
+ 皆様、迅速なご回答ありがとうございます。適切な説明になっていない点もあり、改めて実現したい処理の流れを以下に記載させていただきます。
144
+
145
+ ### 処理の流れ
146
+
147
+ send関数実行[1秒]→send関数実行→[1秒]→send関数実行→[3秒]→send関数実行→[1秒]→・・・
148
+
149
+
150
+
151
+ 「send関数実行→[1秒]」が一つの処理の単位で、これがn回終われば3秒待つというような処理を書こうとしています。