Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何制作Qt线程包装器_C_Multithreading_Qt_Wrapper - Fatal编程技术网

C 如何制作Qt线程包装器

C 如何制作Qt线程包装器,c,multithreading,qt,wrapper,C,Multithreading,Qt,Wrapper,我已经编写了一些库代码(用C语言)来帮助创建和查询独立于平台的线程。下面是创建线程的API的psuedo代码示例: result OS_createThread ( pointer to thread handle (set after thread is created), stack size, function to run, pointer to parameters, priority ) 根据平台的不同,我使用包含

我已经编写了一些库代码(用C语言)来帮助创建和查询独立于平台的线程。下面是创建线程的API的psuedo代码示例:

 result OS_createThread ( 
      pointer to thread handle (set after thread is created), 
      stack size,
      function to run, 
      pointer to parameters,
      priority )
根据平台的不同,我使用包含特定OS实现的适当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的内容


感谢您的指导

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


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

要创建QThread,您将实现从QThread继承的类。以

在您的实现中隐藏的是:

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方法,所以我认为在类变量中存储指向它们的指针没有问题(如果我错了,请纠正我-还没有尝试过;)


然而,这实际上有点棘手,因为必须有人释放为
线程
变量创建的内存。在我的示例中,这不容易(从C接口)实现。因此,您可能需要考虑使用一个内部管理器类或一些处理创建的线程并根据需要销毁它们的东西。然而,为了对如何实现这一目标做出有保留的陈述,我需要更多的信息;)

我的代码需要移植到Qt应用程序中。那部分我无法控制。我的代码几乎是标准的ANSIC,唯一依赖于平台的是线程、互斥体等,所以我需要编写这个包装层。我的理解是,我不能简单地在Qt应用程序中创建pC++(这将在Linux上运行)。你需要学习C++来使用它们。我不确定您不能从使用Qt的代码中使用pthread-s。在将胶水移植到QThread-s之前,我将首先尝试。在4.4版本之后,从QThread继承并不是在Qt中创建线程的最佳实践。请注意,即使是Qt文档也不是最新的。有一篇关于在Qt中实现线程的最佳方法的非常好的文章。好的一点我没有意识到,所以谢谢你的提示。然而,答案的基本原则应该保持不变。因此,请遵守新的约定,并相应地实现一个包装器。为了停止线程并释放内存,还有一个API函数OS_destroyThread()。它需要一个线程句柄。我只是将句柄转换为“MyThread”类型的指针,调用terminate()、wait(),然后“删除”指针。这将终止线程并清理内存。谢谢你的帮助!
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;
}