我编写了一些库代码(在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的内容。
感谢任何指导!
答案 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线程的详细信息)。