2

メインアプリケーションの別のスレッドでコードを実行したいので、いくつかのファイルを作成しました:

スレッド2.h

#ifndef THREAD2_H
#define THREAD2_H
#include <QThread>

class thread2 : public QThread
{
    Q_OBJECT

public:
    thread2();

protected:
    void run();

};

#endif // THREAD2_H

thread2.cpp

#include "thread2.h"

thread2::thread2()
{
    //qDebug("dfd");
}
void thread2::run()
{
    int test = 0;
}

そしてmain.cppというメインファイル

#include <QApplication>
#include <QThread>
#include "thread1.cpp"
#include "thread2.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    thread2::run();

    return a.exec();
}

しかし、それは機能しません...

Qt Creator からの指示:「オブジェクトなしでメンバー関数 'virtual void thread2::run()' を呼び出すことはできません」

ありがとう !

4

2 に答える 2

7

このように呼び出す:関数thread2::run()を呼び出す方法ですが、そうではありません。staticrun()

また、メソッドを明示的に呼び出さないスレッドを開始するにはrun()、スレッドオブジェクトを作成してstart()呼び出す必要があります。これrun()により、適切なスレッドでメソッドが呼び出されます。

thread2 thread;
thread.start()
...
于 2012-11-29T17:48:42.413 に答える
2

関数へのポインターを渡すことができる単純なスレッド クラスは次のとおりです。

typedef struct TThread_tag{
int (*funct)(int, void*);
char* Name;
int Flags;
}TThread;

 class Thread : public QThread {
 public:
   TThread ThreadInfoParm;
   void setFunction(TThread* ThreadInfoIn) 
   {
      ThreadInfoParm.funct = ThreadInfoIn->funct;   
   }
 protected:
    void run() 
    {
      ThreadInfoParm.funct(0, 0);   
     }
    };

 TThread* ThreadInfo = (TThread*)Parameter;
 //Create the thread objedt
 Thread* thread = new Thread;
 thread->setFunction(ThreadInfo);//Set the thread info
 thread->start();  //start the thread
于 2013-09-17T15:44:40.367 に答える