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

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

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

Re[2]: スレッド操作とリストビュー


(過去ログ 107 を表示中)

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

■63874 / inTopicNo.1)  スレッド操作とリストビュー
  
□投稿者/ td700 (1回)-(2012/10/23(Tue) 13:43:36)

分類:[C#] 

2012/10/23(Tue) 13:45:21 編集(投稿者)

スレッド操作とリストビュー

期待する動作は、
下記(1)の直後の受信データが、スレッド3で充分待つ間にスレッド2のInvokeで
リストビューに書き込まれ、(4)で読むことができるということです。
実際には、スレッド3が終わるまで、スレッド2の動作はブロックされるようです。
スレッド2の優先度を最大にしても変化はありませんでした。
スレッド3が優先されるのはなぜでしょうか。


// スレッド1
private void thdmethod1() {
// 受信データをバッファ2に転送する
}

// スレッド2
private void thdmethod2() {
while ( true ) {
if (条件:バッファ2にデータあり){
// dlgint はリストビューに書き込むデリゲート
Invoke(dlgint, length);
}
Thread.Sleep(200);
}
}

// スレッド3
private void thdmethod3() {
Thread.Sleep(5000); // 5秒待つ
}


// フォームクラス上での処理
thd1.IsBackground = true;
thd1.Start()
thd2.IsBackground = true;
thd2.Start()

private void button2_Click(....){

// ここで送信を実行する。その後1秒以内には応答を完了しているはず。
SendFunc(........);------------(1)

thd3.IsBackground = true;
thd3.Start(); ---------------(2)
thd3.Join(); ------------(3)

if (条件:リストビュー内の値を読む){ ------(4)
}
}



引用返信 編集キー/
■63875 / inTopicNo.2)  Re[1]: スレッド操作とリストビュー
□投稿者/ Hongliang (7回)-(2012/10/23(Tue) 14:37:44)
優先がどうとか言う話ではありません。

> SendFunc(........);------------(1)
>
> thd3.IsBackground = true;
> thd3.Start(); ---------------(2)
> thd3.Join(); ------------(3)

これはボタンクリックのイベント時に実行されています。当然UIスレッドで実行されます。
で、別スレッドを開始してすぐその完了を待機していますね。UIスレッドが。

Control.Invokeは、UIスレッドに処理を行わせるメソッドです。
ここで、その処理を行わせたいUIスレッドは絶賛待機中です。thd3が終わるまで待てと言われてますから。
なので、その待機が完了するまでUIスレッドは他の仕事はできません。

UIスレッドで待機のたぐいはやめましょう。
引用返信 編集キー/
■63878 / inTopicNo.3)  Re[2]: スレッド操作とリストビュー
□投稿者/ td700 (2回)-(2012/10/23(Tue) 16:08:26)
とりあえず理由は分かりました。
ありがとうございました。




解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -