C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: VB Backgroundworker スレッドについて


(過去ログ 70 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■40737 / inTopicNo.1)  VB Backgroundworker スレッドについて
  
□投稿者/ hs (121回)-(2009/09/02(Wed) 02:04:12)

分類:[VB.NET/VB2005 以降] 

VS2008 VB
いつもお世話になっております。今回はBackgroundWorkerについて教えてください。

現在、WPFユーザーコントロールを作成、MediaElementをつかって動画を再生するWinアプリを作っています。
過去にAccessでリアルタイムの時刻を表示するPGを書いた際に、Timerを使用するとTick時にフォームが一時停止みたいな不具合が出ていました。
それを踏まえて、
今回の動画再生時に、MediaElementのPositionをTimerを使用し表示させてみました、案の定Tickイベント時に同上の不具合が出ております。
(もしかするとPCスペックが原因でしょうか?)
そこで、Positionの表示をBackgroundWorkerに変えてみる事にしました。

'MediaElement再生開始時にBackgroundWorker開始
Private Sub BackgroundWorker_DoWork(...中略...) Handles BackgroundWorker.DoWork
Do
'別スレッドで実行されるため、このメソッドでは,UI(コントロール)を操作してはいけないという事なので
'ProgressChangedイベント発生させ、そこでPositionを表示する
worker.ReportProgress(Nothing)
System.Threading.Thread.Sleep(1000) '1秒Sleep
Loop
End Sub

Private Sub BackgroundWorker_ProgressChanged(...中略...) Handles BackgroundWorker.ProgressChanged
'MediaElementのPosition表示
Label.Text = MediaElement.Position 'MediaElementのPosition表示
  Trackber.Value = MediaElement.Position 'Trackberの値セット
End Sub

とこんな感じになりました、DoWorkイベントではUI操作は出来ないという事なので、ProgressChangedイベントでコントロールの操作をしました。
つまりDoWorkは別スレッドだが、ProgressChangedというものは、メインスレッドの扱いになるのでコントロールの操作が出来る。
という考え方で間違いないのでしょうか?
もしそうであれば、Timerを使ってPositionを表示しているのと同じ事を上記PGで行ったことになるのでしょうか?
結局のところスレットを分けたところで同じだけCPUやメモリを使う事になるのでTick時のあの独特な一時停止みたいな不具合は避けられないのでしょうか?

よろしくお願いします。







引用返信 編集キー/
■40743 / inTopicNo.2)  Re[1]: VB Backgroundworker スレッドについて
□投稿者/ Azulean (441回)-(2009/09/02(Wed) 07:19:44)
No40737 (hs さん) に返信
> つまりDoWorkは別スレッドだが、ProgressChangedというものは、メインスレッドの扱いになるのでコントロールの操作が出来る。
> という考え方で間違いないのでしょうか?
> もしそうであれば、Timerを使ってPositionを表示しているのと同じ事を上記PGで行ったことになるのでしょうか?
そうなります。

> 結局のところスレットを分けたところで同じだけCPUやメモリを使う事になるのでTick時のあの独特な一時停止みたいな不具合は避けられないのでしょうか?
「Tick 時のあの独特な一時停止みたいな不具合」というのがよく分かりません。
Tick イベント毎に固まったような感じになるのであれば、Tick イベントの中の処理が重い(or 遅い or 時間がかかる)ということでしょうか?
引用返信 編集キー/
■40760 / inTopicNo.3)  Re[2]: VB Backgroundworker スレッドについて
□投稿者/ hs (122回)-(2009/09/02(Wed) 11:14:04)
No40743 (Azulean さん) に返信

> 「Tick 時のあの独特な一時停止みたいな不具合」というのがよく分かりません。
> Tick イベント毎に固まったような感じになるのであれば、Tick イベントの中の処理が重い(or 遅い or 時間がかかる)ということでしょうか?

申し訳ありません伝え方が下手でした。
「固まったような感じ」になる。ズバリです。

今回はProgressChanged時の処理は一部省略させていただいていたのですが、他にもDataViewをコードで生成し特定の条件にヒットする文字列を抽出しヒットすれば、
Formに表示するという内容のPGもあります。

Dim Dts As DataSet 'Dtsの中身はForm読み込み時にセット、グローバル宣言

If Dts.Tables("Table").Rows.Count > 0 Then
  Dtv = New DataView(Dts.Tables("Table"), "条件='" & Label01.Text & "'", "", DataViewRowState.CurrentRows)
  If Dtv.Count > 0 Then
    Label02.Text = Dtv.Item(0).Item0) '文字列セット
  End If
End If

毎回、Dtvを生成しその中身からの抽出を行っています。
さほど時間のかかる処理ではないと思うのですが、やはり動画再生を行っているということがPCに負荷が掛ってしまい「固まる」という症状がでてしまっているみたいです。

この症状の回避は、やはりPCスペックでしか回避できない問題になりますよね...?
なにか良い手法あれば教えてください。
引用返信 編集キー/
■40762 / inTopicNo.4)  Re[3]: VB Backgroundworker スレッドについて
□投稿者/ hs (123回)-(2009/09/02(Wed) 11:24:12)
追記です。
Dts.Tables("Table").Rows.Count は1〜100件程度で通常は十数件です。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -