0

処理するデータを持つリストがあります。そして、私は2つのスレッドを持っています、

UI スレッド : リスト アイテムを更新/追加します。

スレッド 1 : 項目がリストに追加されると、項目が 1 つずつ別のスレッド 2 に送信されます。

スレッド 2 : 機能し、それに応じてアイテムを更新します。作業が完了すると、リストをチェックし、対応するアイテムがまだリストに存在する場合、存在する場合はデータを処理します。

ウィンドウを閉じるときにUIスレッドから、UIから追加されたアイテムをマップから削除しています。スレッド 2 がリストから削除された項目に進まないようにします。

そして、UI destruct または、リストに追加されたアイテム インスタンスを削除しています。

問題は、スレッド 2 が既にアイテムを処理していることです。その間にウィンドウが閉じられ、デストラクタもスレッド 2 で処理中のアイテムを削除しました。

そのため、スレッド 2 によるデータの処理がクラッシュします。

私はMFCでこれを行いました。これら 2 つのスレッドを同期する方法 (UI の削除とスレッド 2)。MFC にはさまざまなスレッド同期方法があることは知っています。このシナリオに最適な方法はどれですか?

4

1 に答える 1

1

操作を停止したい場合 (おそらくユーザーが [閉じる] ボタンをクリックしたとき)、最初にスレッドに終了を指示します。これは、スレッドが定期的にチェックする bool またはイベント (SetEvent) を使用して実行できます。スレッドに終了を指示した後は、スレッドが終了したことを確認するまで、スレッドで使用されている UI またはデータを削除しないでください。スレッドが終了するまで待機するには、WaitForSingleObject のスレッド ハンドルを使用します。WaitForSingleObject は、スレッドが終了したことをスレッド ハンドルが通知するまで、呼び出し元のスレッドを中断します。その後、削除と UI のシャットダウンを続行できます。

于 2013-10-17T03:08:52.797 に答える