クラス間の機能分担とQtのスレッド [Qt]
さて、今週はQtの話に戻ります。前回、バックアップ処理の実現に何らかの並行処理が必要なことに気付きました。って、最初から気づけよと言う感じですかね・・。手動で停止することが頭に無かったのでした。
「並行処理」でぱっと思いついたのが「スレッド」ですが、Qtにはどのような並行処理が用意されているのでしょうか・・?と思って、リファレンスを眺めていたら、スレッドのページがありました。ここを読んで行きましょう。
*
単純にスレッドを実行するには、下記の通り行えばいい様です。
クラス図にすれば、こんな感じでしょうか?ファイルのバックアップ処理を行うクラスを「BackupMain」としました。
バックアップ処理をスレッド化する際のクラス図
どういう機能のクラスにすればいいですかねぇ・・。バックアップ処理の分担分けとしては、下記の通りにしたい気がします。
実装イメージとしては、BackupMain内にバックアップ元、バックアップ先(今回の場合、バックアップ元一つ一つに持たせる意味はありませんが・・)のペアを保存するキューを持たせ、BackupControlからそこにファイルのパスを追加、BackupMainでパスを取り出してコピーを実行としたいと思っています。
・・・とここまで考えていましたが、も一つスレッドが必要かも・・・。バックアップ元のファイルの抽出をBackupControlで行っていると、停止ボタンのイベントが拾えない気がします。と言うか、ファイルパスの抽出と実行を同じスレッドですればいいか・・。
機能分担を考えなおすとこんな感じでしょうか。
ま、ほぼ一緒ですね。バックアップ元のディレクトリとバックアップ先ディレクトリをまとめてBackupMainに渡して、後は勝手にやってくれと言う感じにしましょう。
先程のキューの排他処理が必要かと思ってましたが、この構成にすれば、それも不要ですね。
と言う感じで、実装して行きましょう。
【参考】
・Thread Support in Qt - Qt 4.5.3
「並行処理」でぱっと思いついたのが「スレッド」ですが、Qtにはどのような並行処理が用意されているのでしょうか・・?と思って、リファレンスを眺めていたら、スレッドのページがありました。ここを読んで行きましょう。
*
単純にスレッドを実行するには、下記の通り行えばいい様です。
- QThreadのサブクラスを作成。
- サブクラス内で、QThread::run()に実行させたい処理を記述。
- QThread::start()でスレッドを実行。
クラス図にすれば、こんな感じでしょうか?ファイルのバックアップ処理を行うクラスを「BackupMain」としました。
バックアップ処理をスレッド化する際のクラス図
どういう機能のクラスにすればいいですかねぇ・・。バックアップ処理の分担分けとしては、下記の通りにしたい気がします。
BackupControl | バックアップ元ファイルとバックアップ先ディレクトリを選定し、BackupMainに通知。 BackupMainの開始と停止制御。 |
BackupMain | BackupControlから指定された情報を元に順次バックアップを実行。 |
実装イメージとしては、BackupMain内にバックアップ元、バックアップ先(今回の場合、バックアップ元一つ一つに持たせる意味はありませんが・・)のペアを保存するキューを持たせ、BackupControlからそこにファイルのパスを追加、BackupMainでパスを取り出してコピーを実行としたいと思っています。
・・・とここまで考えていましたが、も一つスレッドが必要かも・・・。バックアップ元のファイルの抽出をBackupControlで行っていると、停止ボタンのイベントが拾えない気がします。と言うか、ファイルパスの抽出と実行を同じスレッドですればいいか・・。
機能分担を考えなおすとこんな感じでしょうか。
BackupControl | バックアップ元ディレクトリとバックアップ先ディレクトリをBackupMainに通知。 BackupMainの開始と停止制御。 |
BackupMain | BackupControlから指定された情報を元に対象ディレクトリを選定し、順次バックアップを実行。 |
ま、ほぼ一緒ですね。バックアップ元のディレクトリとバックアップ先ディレクトリをまとめてBackupMainに渡して、後は勝手にやってくれと言う感じにしましょう。
先程のキューの排他処理が必要かと思ってましたが、この構成にすれば、それも不要ですね。
と言う感じで、実装して行きましょう。
【参考】
・Thread Support in Qt - Qt 4.5.3
コメント 0