来自非 Qt 线程的 QThread::getCurrentThread()

Posted

技术标签:

【中文标题】来自非 Qt 线程的 QThread::getCurrentThread()【英文标题】:QThread::getCurrentThread() from non-Qt thread 【发布时间】:2013-04-25 05:56:03 【问题描述】:

如果从non-Qt thread 调用,我将从QThread::getCurrentThread() 得到什么?

谢谢!

【问题讨论】:

何不试试看? 你的意思是QThread::currentThread()吗?还有一个问题:你为什么要这样做? 这可能是未定义的行为。 【参考方案1】:

QThread 只是一个包装器,在后台它使用本地线程。

QThread::currentThread 创建并初始化一个 Q(Adopted)Thread 实例(如果它尚不存在)。

对于 unix,它使用pthreads。

#include <iostream>
#include <thread>
#include <pthread.h>

#include <QThread>
#include <QDebug>

void run() 
    QThread *thread = QThread::currentThread();

    qDebug() << thread;
    std::cout << QThread::currentThreadId() << std::endl;
    std::cout << std::this_thread::get_id() << std::endl;
    std::cout << pthread_self() << std::endl;

    thread->sleep(1);
    std::cout << "finished\n";


int main() 
    std::thread t1(run);
    t1.join();

输出:

QThread(0x7fce51410fd0) 
0x10edb6000
0x10edb6000
0x10edb6000
finished

我看到there是Qt应用主线程的初始化:

data->threadId = (Qt::HANDLE)pthread_self();
if (!QCoreApplicationPrivate::theMainThread)
    QCoreApplicationPrivate::theMainThread = data->thread;

所以可能会有一些副作用。

我建议不要将 QThread 与非 Qt 线程混合使用。

【讨论】:

可能有什么副作用?为什么不建议混合使用? 反之亦然兼容吗?即使用QThreads 创建一个线程,然后使用this_thread::get_id() 获取id。

以上是关于来自非 Qt 线程的 QThread::getCurrentThread()的主要内容,如果未能解决你的问题,请参考以下文章

Qt 4.8:来自不同线程的两个信号和一个插槽之间的连接行为

可重入与线程安全(大多数Qt类是可重入,非线程安全的)

Qt笔记-QTcpSocket跨线程调用(官方推荐方法,非百度烂大街方法)

从来自 QTcpSocket 的数据流中连续运行复杂算法的最佳 Qt 线程解决方案是啥?

Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)

当连接类型 = Qt.DirectConnection 时,来自线程对象的 PyQt5 信号会导致段错误