سؤال

في طلبي هناك الخيط الرئيسي وترابط عامل (QThread).
من الخيط الرئيسي الذي ترغب في استدعاء الأسلوب من بلدي ترابط عامل، وأنها تعمل في سياق لمؤشر الترابط.

ولقد حاولت استخدام QMetaObject::invokeMethod وتعطيه الخيار QueuedConnection ولكنه لا يعمل.
لقد حاولت ايضا انبعاث إشارات من موضوع الرئيسي (وهذا مرتبط إلى فتحة الخيط عامل)، ولكن التي فشلت أيضا.

وهنا مقتطف من نحو ما حاولت:

class Worker : public QThread
{
    Q_OBJECT

public:
    Worker() { }

    void run() 
    { 
        qDebug() << "new thread id " << QThread::currentThreadId(); 
        exec(); 
    }

public slots:
    void doWork()
    {
        qDebug() << "executing thread id - " << QThread::currentThreadId();
    }
};

وباستخدام طريقة QMetaObject:

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

    qDebug() << "main thread id - " << QThread::currentThreadId();

    Worker worker;
    worker.start();

    QMetaObject::invokeMethod(&worker, "doWork", Qt::QueuedConnection);

    return a.exec();
}

وباستخدام طريقة إشارة:

class Dummy : public QObject
{
    Q_OBJECT

public:
    Dummy() { }

public slots:
    void askWork() { emit work(); }

signals:
    void work();
};

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

    qDebug() << "main thread id - " << QThread::currentThreadId();

    Worker worker;
    worker.start();

    Dummy dummy;
    QObject::connect(&dummy, SIGNAL(work()), &worker, SLOT(doWork()), Qt::QueuedConnection);

    QTimer::singleShot(1000, &dummy, SLOT(askWork()));

    return a.exec();
}

وكلا الاتجاهين تؤدي إلى هوية الموضوع الرئيسي الذي طبع في QThread doWork.

وبالإضافة إلى ذلك، فكرت في تنفيذ بسيط بين المنتجين والمستهلكين ولكن إذا كان هذا يعمل، هل هناك أي سبب لماذا لا تفعل ذلك بهذه الطريقة؟

هل كانت مفيدة؟

المحلول

وكانت المشكلة أن المتلقي (على QThread) 'يعيش' في الموضوع الرئيسي، وبالتالي حال حلقة الخيط الرئيسي هو الذي ينفذ الفتحة.

ومن مستندات كيو تي في:

<اقتباس فقرة>   

ومع وصلات في قائمة الانتظار، يتم استدعاء فتحة عندما يعود التحكم إلى حلقة الحدث في الموضوع الذي ينتمي إليه الكائن. يتم تنفيذ فتحة في الموضوع حيث يعيش الكائن المتلقي.

وبالتالي فإن الحل لقد وجدت وحتى الآن لإنشاء كائن داخل المدى لمؤشر الترابط () واستخدام فتحات بدلا من ذلك. بهذه الطريقة صاحب المتلقي هو الخيط ثم يسمى فتحة في سياق المواضيع.

نصائح أخرى

وهذا المثال يوضح كيف يمكنك تقسيم الطبقة العلمي، والعمل على انجاحه كما تريد. تحتاج أيضا إلى إتاحة إشارة أو مؤشر إلى مثيل عامل لتكون قادرا على الاتصال إلى فتحة.

class Worker : public QObject
{
    Q_OBJECT

public:
    Worker() { }

public slots:
    void doWork()
    {
        qDebug() << "executing thread id - " << QThread::currentThreadId();
    }
};

class WorkerThread : public QThread
{
    Q_OBJECT

public:
    void run()
    {
        qDebug() << "new thread id " << QThread::currentThreadId(); 
        Worker worker;
        exec();
    }
};

لومثال بسيط بين المنتجين والمستهلكين، إلقاء نظرة على دخول بلوق من برادلي T. هيوز <لأ href = "http://blog.qt.digia.com/blog/2006/12/04/threading- دون-ث-الصداع / "يختلط =" نوفولو noreferrer "> الدوس دون صداع في رأس .

ويتم إنشاء عامل في الموضوع الرئيسي، وبالتالي فإنه من ونتم الأحداث في مؤشر الترابط الرئيسي. يجب عليك نقل العمال إلى انها موضوع خاص:

Worker worker;
worker.moveToThread(&worker);
worker.start();

والآن كيو تي يعرف حياة worker في موضوع جديد، وسوف قائمة الانتظار الأحداث في تلك الحلقة الحدث.

ويبدو ان يكمل ترابط عامل قبل أن تتمكن حتى استدعاء أي وظيفة أو إرسال إشارة إلى ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top