c - 如何制作 Qt 线程包装器

标签 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 文件来启动线程。例如

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 的内容。

感谢任何指导!

最佳答案

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

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

关于c - 如何制作 Qt 线程包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7932971/

相关文章:

qt - 不想在我的对话框上有关闭按钮

c - 绘制分段线,其中线段基于变量着色

windows - GDI+后台线程有什么作用?

python - 在python中使用threading/multiprocessing同时进行多个计算

image - Qt-OpenCV :How to display grayscale images(opencv) in Qt

c++ - 创建简单的 qml 应用程序

c - Vim 自动完成 C 中的结构

c - 删除结构中的位字段

c - 从 sockaddr_storage 检索 ip 和端口

c++ - boost 线程互斥数组