gpt4 book ai didi

c++ - qt类中的线程

转载 作者:太空宇宙 更新时间:2023-11-04 15:24:57 25 4
gpt4 key购买 nike

我在一个定义了一些数据的 qt 应用程序中有这个类:

class TableView:public QWidget 
{
Q_OBJECT

public:TableView (QWidget * parent = 0);

std::vector < float > arr;

还有一些类函数等等..现在我想在另一个线程中添加一个套接字服务器(可能来自此类内部),当它从套接字中接收到一些东西时能够从此类访问数据,计算新数据并返回。

对于我使用的测试:

  //defines
DWORD WINAPI SocketHandler(void* lp);
DWORD WINAPI starttremeshserver(void* lp);


CreateThread(0,0,&starttremeshserver, (void*)csock , 0,0);

这行得通。现在我需要一些简单且独立于平台的东西。因为我在 qt 中工作,所以可能与 qthread 有关。

那么问题来了,我能不能在一个可以访问类数据的类中创建一个新的线程函数。型

最佳答案

Qt 提供了您需要的一切。您的需求如下:

  1. TableView 类的数据成员进行线程安全(序列化)访问。

  2. 网络原语。

  3. 将网络访问灵活地转移到单独的线程。

您可能正在从网络接收数据,并希望更新 arr 成员。你会这样做:

  1. 创建一个 QObject 派生类,比如 Processor,它有一个设置网络连接的插槽(可能是一个 QTcpServer).建立连接后,使用QTcpSocket 交换数据。确保所有数据处理都在类中的槽中完成。当 vector 中有新值要更新时,只需发出一些信号,例如hasFloat(int,float)

  2. TableView 中添加一个 setFloat(int,float) 槽。

  3. Processor 实例的 setFloat 信号连接到您的 TableView

此时,一切都在 GUI 线程中运行,但代码是非阻塞的,因为您永远不会等待网络数据;您响应 QTcpServerQTcpSocket 发出的信号。如果你愿意,你可以保留它。

Processor 类在单独的线程中运行,如果您的基准测试显示您的主线程受 CPU 限制,那么这很简单:

int main(int argc, char** argv) {
bool separateThread = true;
QApplication app(argc, argv);
TableView view;
Processor proc;
connect(&proc, SIGNAL(hasFloat(int,float)), &view, SLOT(setFloat(int,float)));
QThread thread;
if (separateThread) {
thread.start();
proc.moveToThread(&thread);
}
view.show();
const bool rc = app.exec();
if (thread.isRunning()) {
thread.exit(); // tells the event loop in the thread to bail out
thread.wait(); // waits for the above to finish
}
return rc;
}

有这样一种误解,认为跨线程传播事物会以某种神奇的方式使它们变得更好。线程是特定问题的解决方案:正在完成的计算的 CPU 边界性和阻塞 API。如果您的处理是微不足道的,您就不太可能受 CPU 限制。 Qt 提供非阻塞、异步网络。因此,通常完全不需要旋转第二个线程。

您必须先显示实数,否则会显示实数。否则您正在购买 线程 cargo 崇拜:哦,它是网络,它必须进入一个单独的线程。不,不一定。先测量。了解您在做什么。

上述代码中线程安全的原因如下:当您将 Processor 实例移动到不同的线程时,Qt 将使用 Qt::QueuedConnection 重新连接所有信号槽连接 类型。因此,当 Processor 发出 hasFloat 时,它会在内部导致事件在 TableView 所在线程的事件队列中排队—— GUI 线程,在这种情况下。当事件循环旋转时(这里是应用程序的事件循环)——它会拾取事件并执行对 TableView::setFloat 的调用。这确保了对 arr 数据成员的访问是序列化的,并且不可能从多个线程并发访问。

关于c++ - qt类中的线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10878720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com