【问题标题】:How to get winapi thread HANDLE from QThread?如何从 QThread 获取 winapi 线程句柄?
【发布时间】:2022-01-16 19:49:10
【问题描述】:

我想使用CancelSynchronousIo() 函数,所以我需要一个线程句柄。在我的 QT 应用程序中,我有两个线程: mainThread ( gui ) 和 secondThread 用于计算。我想在 mainThread 中使用 CancelSynchronousIo() 来取消 secondThread 中的操作。我不知道如何从 Qt 类中获取 winapi 线程句柄。

我试过了:

主线程:

   thread = new QThread(this);
   simpleObject = new SimpleClass();
   connect(this, &MainWindow::getHandle, simpleObject , &simpleClass::getHandle);
   simpleObject->moveToThread(thread);
   thread->start();

SimpleObject,在第二个线程中:

void simpleClass::getHandle()   // this is slot in simpleObject, which is in the second thread
{
   emit handleFromSecondThread(GetCurrentThread());
}

我看到第二个线程中 GetCurrentThread() 的值与 mainThread 中 GetCurrentThread() 的值相同

【问题讨论】:

  • 我看到第二个线程中 GetCurrentThread() 的值与 mainThread 中 GetCurrentThread() 的值相同,因为这个 api 总是返回 ( (HANDLE)(LONG_PTR) -2 ) 跨度>
  • @RbMm 是的,你是对的。我总是得到0xfffffffffffffffe。但是该怎么做呢?
  • 我认为 IO 线程上的 OpenThread(READ_CONTROL | THREAD_QUERY_INFORMATION, FALSE, QThread::currentThreadId()) 之类的东西应该给你句柄。唯一的问题是如何最好地将该 HANDLE 值传达给想要进行CancelSynchronousIo 调用的其他线程。没有看到更多代码很难说更多。

标签: qt winapi handle


【解决方案1】:

你需要QThread::currentThreadId(),它返回执行它的线程的ID,即它调用GetCurrentThreadId()。然后,您可以通过使用该 ID 调用 OpenThread() 来获取 句柄

请注意,这与 GetCurrentThread() 不同,后者返回一个仅表示“当前线程”的常量。

【讨论】:

  • QThread::currentThreadId() 返回的不是线程句柄,而是线程 ID。然后质疑它返回的 id 是哪个线程?对于QThread 的某些实例?但在这种情况下,函数不能是静态的。如果它是静态的 - 它只能返回当前正在执行的线程的 id。这是毫无意义的
  • @RbMm 谢谢,我编辑了答案以将 ID 转换为实际的 HANDLE。是的,它是一个静态函数,因此在 QThread 的实例上调用它不会产生该线程的 ID,但始终会产生调用线程的 ID。
  • 但是这个调用线程的id,当我们需要另一个线程的最小id时
  • 为了让QThread::currentThreadId() 返回正确的ID,您需要在线程本身的上下文中调用它,即在QThread::run() 内部。这意味着不直接使用QThread,而是从QThread 派生,因此您可以覆盖run()
【解决方案2】:

AFAIK,QThread 不提供对底层操作系统线程的HANDLEID 的访问。我能想到的获取线程的HANDLE 的唯一方法是从QThread 派生一个新类并覆盖其虚拟run() 方法以执行以下操作之一:

  • 调用QThread::currentThreadId()(或直接GetCurrentThreadId()),然后将返回的ID传递给OpenThread()

  • 调用GetCurrentThread(),然后将返回的伪句柄传递给DuplicateHandle()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2018-05-10
    相关资源
    最近更新 更多