如何制作Qt线程包装器

时间:2011-10-28 17:53:22

标签: c multithreading qt wrapper

我编写了一些库代码(在C中),以便于创建和查询独立于平台的线程。这是创建线程的API的伪代码示例:

 result OS_createThread ( 
      pointer to thread handle (set after thread is created), 
      stack size,
      function to run, 
      pointer to parameters,
      priority )

根据平台的不同,我使用包含特定操作系统实现的相应c文件来启动线程。 E.g。

result OS_createThread ( 
 // Windows implementation
 map priority to Windows priority
 // Use Win32 threading call
 CreateThread(blah blah)

我为Win32,POSIX线程和我使用的一些RTOS创建了端口。现在我需要在Qt环境中这样做,我有点难过。首先,我是一个Qt新手,第二,它看起来需要使用QThread类的面向对象方法。

这一点是隐藏线程创建的内容给调用者。调用者希望能够启动线程并维护该线程的句柄,以便将来可以更改其优先级或杀死它。

使用QThreads,每次请求新线程时都需要创建一个新的QThread对象吗?请记住,调用代码不能具有任何特定于Qt的内容。

感谢任何指导!

2 个答案:

答案 0 :(得分:2)

要创建QThread,您将实现一个继承自QThread的类。取自QT Documentation

的示例
class MyThread : public QThread
 {
 public:
     void run();
 };

 void MyThread::run()
 {
     QTcpSocket socket;
     // connect QTcpSocket's signals somewhere meaningful
     ...
     socket.connectToHost(hostName, portNumber);
     exec();
 }

隐藏在您的实施中将是:

result OS_createThread ( 
      pointer to thread handle (set after thread is created), 
      stack size,
      function to run, 
      pointer to parameters,
      priority )
{
  MyThread *thread = new MyThread(size, function, parameters, prio);
  thread->start();
  return thread;
}

因此,您的C接口方法将为所请求的每个线程创建此类的实例。然后,该类应存储从其函数传递到其成员变量中的所有相关数据。要执行的线程函数将在run()方法中调用。因为你似乎只执行C方法,所以我认为在类变量中存储指向它们的指针没有问题(如果我错了,请纠正我的任何人 - 还没有尝试过;)。

然而,它实际上比这更棘手,因为有人必须释放为thread变量创建的内存。这不容易(来自C接口)可能与我的例子。因此,您可能需要考虑使用内部管理器类或处理创建的线程的内容,并根据需要销毁它们。然而,为了做出关于如何实现这一目标的合格声明,我需要更多信息;)

答案 1 :(得分:0)

如果调用代码不是Qt特定的,为什么要使用或实现QThread-s?

如果您的目标是将QThread-s(实际上是QCore库)移植到您的奇怪操作系统,我将首先详细研究它们如何在Pthreads上面实现它(假设您已经熟悉了posix线程的详细信息)。