スレッドQThread
1つのスレッドを生成。Widget上にボタンを作成してボタンをクリックするごとにスレッドを1ステップ処理させる。
- スレッドスタートボタン
- printf表示
スレッド動作
↓正しい記述方法かはわからんですが、とりあえず動いたので。
- mythread.h
- #ifndef __MYTHREAD_H
- #define __MYTHREAD_H
-
- #include <QThread>
- #include <QWaitCondition>
- #include <QMutex>
-
- class MyThread : public QThread
- {
- Q_OBJECT
-
- public:
- MyThread( QObject *parent=0 );
-
- public slots:
- void active();
-
- protected:
- void run();
-
- private:
- QWaitCondition condition;
- QMutex mutex;
- };
-
- #endif
-
- mythread.cpp
- #include "mythread.h"
-
- #include <cstdio>
-
- MyThread::MyThread( QObject *parent )
- : QThread(parent)
- {
- }
-
- void MyThread::active()
- {
- condition.wakeOne();
- //printf( "actived\n" );
- }
-
- void MyThread::run() {
- int no=0;
-
- while (true) {
- for (int i=0; i<10; ++i) {
- }
- ++no;
-
- mutex.lock();
- condition.wait( &mutex );
- mutex.unlock();
- }
- }
-
run関数がスレッド関数で無限ループとなっている。
mywidgetのコンストラクタでmythread->start()を呼ぶことで、処理を開始する。
condition.wait()のところで一旦停止、condition.wakeOne()を呼ぶことで次の処理へ進む。
スロットのactive()はQPushButtonのclicked()のシグナルと接続した。
mywidgetのコンストラクタでmythread->start()を呼ぶことで、処理を開始する。
condition.wait()のところで一旦停止、condition.wakeOne()を呼ぶことで次の処理へ進む。
スロットのactive()はQPushButtonのclicked()のシグナルと接続した。
mythread.h
mythread.cpp
mywidget.h
mywidget.cpp
main.cpp
メモ
スロットを持たせようとした場合、Q_OBJECTをクラスの定義内に記述しないといけないみたいだけど、コンパイルしていたら次のメッセージがリンク時に出てエラーになってしまった。
"undefined reference to vtable for xxxxxx"
これはどうもmocというものを自動生成されるときにうまくいっていないのが原因みたい。
いろいろためしてみたら、1つのファイル(.cpp)にクラスの定義やmainを書いてしまったのが原因のよう。
1つのクラス定義に対して1つのオブジェクトが生成されるように.cppと.hファイルを作成してmain関数が含まれるものをmain.cppとわけてあげたら問題なくコンパイルできた。
いろいろためしてみたら、1つのファイル(.cpp)にクラスの定義やmainを書いてしまったのが原因のよう。
1つのクラス定義に対して1つのオブジェクトが生成されるように.cppと.hファイルを作成してmain関数が含まれるものをmain.cppとわけてあげたら問題なくコンパイルできた。
mythread.h内の#include <QThread>のところをclass QThread;にしようと思ったんだけど、なんかうまくいかない。
mocファイルを生成するときはヘッダにヘッダを書かないとダメなのか?
mocファイルを生成するときはヘッダにヘッダを書かないとダメなのか?
関連
- QtCore
- QThread
- QMutex
- QMutexLocker
- QWaitCondition
参考にしたページ
以上